TA2220_Set
Kotori
plain_text
a year ago
2.1 kB
9
Indexable
#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std;
class Student {
public:
int id, grade, gender, score;
Student()
{
id = gender = grade = score = -1;
}
Student(int i, int gr, int ge, int s)
{
id = i;
grade = gr;
gender = ge;
score = s;
}
} S[200000];
void del(int index)
{
S[index].id = S[index].gender = S[index].grade = S[index].score = -1;
}
struct cmp {
bool operator() (const int a, const int b) const {
if (S[a].score == S[b].score) return S[a].id < S[b].id;
return S[a].score < S[b].score;
}
};
int cnt = 0;
int indx = 0;
map<int, int> HashID;
set<int, cmp> SetS[4][3]; //S[grade][gender]
void init()
{
cnt = 0;
HashID.clear();
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
SetS[i][j].clear();
}
}
}
int add(int mId, int mGrade, char mGender[7], int mScore)
{
indx = cnt++;
int gender = (strcmp(mGender, "male") == 0) ? 0 : 1;
S[indx] = { mId, mGrade, gender, mScore };
HashID[mId] = indx;
SetS[mGrade][gender].insert(indx);
return 0;
}
int remove(int mId)
{
auto a = HashID.find(mId);
if (a == HashID.end()) return 0;
int index = a->second;
SetS[S[index].grade][S[index].gender].erase(index);
int ans = 0;
HashID.erase(a->first);
if (SetS[S[index].grade][S[index].gender].size() == 0)
{
return 0;
}
else
{
ans = *SetS[S[index].grade][S[index].gender].begin();
}
del(index);
ans = S[ans].id;
return ans;
}
int query(int mGradeCnt, int mGrade[], int mGenderCnt, char mGender[][7], int mScore)
{
int res = 1000000005;
for (int i = 0; i < mGenderCnt; i++)
{
int gr = mGrade[i];
for (int j = 0; j < mGenderCnt; j++)
{
int ge = (strcmp(mGender[j], "male") == 0) ? 0 : 1;
for (auto it : SetS[gr][ge])
{
if (S[it].score >= mScore)
{
if (res > S[it].id)
{
res = S[it].id;
}
break;
}
}
}
}
if (res == 1000000005)
return 0;
return res;
}
Editor is loading...
Leave a Comment