Untitled
unknown
plain_text
2 years ago
2.5 kB
13
Indexable
#define MAX 20011
#include <set>
using namespace std;
struct Compare {
bool operator() (int idp1, int idp2);
};
struct STUDENT {
int id, grade, nextH;
int gender; // 0: female, 1: male
int score;
set<int, Compare>::iterator it;
} pool[MAX];
int Npool;
int hashTB[MAX];
bool Compare::operator() (int idp1, int idp2) {
if (pool[idp1].score != pool[idp2].score)
return pool[idp1].score > pool[idp2].score;
return pool[idp1].id > pool[idp2].id;
}
set<int, Compare> mySet[4][2];
int getIndex(int mid){
int key = mid % MAX;
for (int id = hashTB[key]; id; id = pool[id].nextH){
if (mid == pool[id].id)
return id;
}
return 0;
}
void init() {
for (int i = 0; i < MAX; i++)
hashTB[i] = 0;
Npool = 1;
for (int i = 1; i < 4; i++)
for (int j = 0; j < 2; j++)
mySet[i][j].clear();
return;
}
int add(int id, int grade, char gender[7], int score) {
int mG = gender[0] == 'm' ? 1 : 0;
int key = id % MAX;
pool[Npool].nextH = hashTB[key];
hashTB[key] = Npool;
pool[Npool].gender = mG;
pool[Npool].grade = grade;
pool[Npool].id = id;
pool[Npool].score = score;
pool[Npool].it = mySet[grade][mG].insert(Npool).first;
Npool++;
int x = pool[*mySet[grade][mG].begin()].id;
return x;
}
int remove(int mid) {
int res = 0;
int id = getIndex(mid);
if (!id)
return 0;
mySet[pool[id].grade][pool[id].gender].erase(pool[id].it);
if (mySet[pool[id].grade][pool[id].gender].size())
res = pool[*(--mySet[pool[id].grade][pool[id].gender].end())].id;
return res;
}
int query(int mGradeCnt, int mGrade[], int mGenderCnt, char mGender[][7], int mScore) {
pool[0].score = mScore;
int minScore = 400000;
int minID = 1000000001;
for (int i = 0; i < mGradeCnt; i++) {
for (int j = 0; j < mGenderCnt; j++) {
int mG = mGender[j][0] == 'm' ? 1 : 0;
auto it = mySet[mGrade[i]][mG].lower_bound(0);
if (it != mySet[mGrade[i]][mG].begin()) {
it--;
if ((pool[*it].score < minScore) || ((pool[*it].id < minID) && (pool[*it].score == minScore))) {
minScore = pool[*it].score;
minID = pool[*it].id;
}
}
}
}
if (minID != 1000000001)
return minID;
return 0;
}
Editor is loading...