Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
2.0 kB
1
Indexable
Never
#include<set>
#include<unordered_map>
#define REP(i,x,n) for(int i= (int)(x); i<(int)(n);++i)
#define MP make_pair
using namespace std;

struct student{

	int id;
	int grade;
	int gender;
	int score;
};
struct compare{

	bool operator()(pair<int,int> a,pair<int,int> b){
		if(a.first!=b.first)
			return a.first<b.first;
		return a.second<b.second;
	}
};
student student_list[20001];
int idx;
unordered_map<int,int> hashtable;
set<pair<int,int>,compare> Score[4][2];

void init(){

	idx=0;
	hashtable.clear();
	for(int i=1;i<=3;i++)
	{
		for(int j=0;j<=1;j++)
			Score[i][j].clear();
	}
}

int add(int mId,int mGrade,char mGender[7],int mScore){
	int gender = (mGender[0]=='m')?0:1;
	student_list[++idx].id=mId;
	student_list[idx].grade = mGrade;
	student_list[idx].gender = gender;
	student_list[idx].score = mScore;
	hashtable[mId]=idx;
	Score[mGrade][gender].insert(make_pair(mScore,mId));
	return Score[mGrade][gender].rbegin()->second;
	 
}
int remove(int mId)
{
	if(hashtable.find(mId)==hashtable.end())
		return 0;
	hashtable.erase(mId);
	int grade = student_list[hashtable[mId]].grade;
	int gender = student_list[hashtable[mId]].gender;
	int score = student_list[hashtable[mId]].score;
	Score[grade][gender].erase(make_pair(score,mId));
	if(Score[grade][gender].empty())
		return 0;
	else
		return Score[grade][gender].begin()->second;
}
int query(int mGradeCnt,int mGrade[],int mGenderCnt,char mGender[][7],int mScore)
{

	int res=1e9+7;
	int id = 1e9+7;
	bool flag=0;
	for(int i=0;i<mGradeCnt;i++)
	{
		for(int j=0;j<mGenderCnt;j++)
		{
			int grade = mGrade[i];
			int gender = mGender[j][0]=='l';
			 auto it = Score[grade][gender].lower_bound(make_pair(mScore,-1));
			 if(it==Score[grade][gender].end()) 
				 continue;
			 if(it->first<res || (it->first==res && it->second<id)){
				 res=it->first;
				 id = it->second;
				 flag=1;
			 }

		}
	}
	if(flag)
		return id;
	return 0;
}