zstu月赛 招生
浙江理工大学招生,一开始有0名学生报考,现在有如下几种情况;
1.增加一名报考学生,报考学生成绩为x;
2.一名成绩为x的学生放弃报考。
3.从现在报考的学生来看,老师想知道如果要招生至少x名学生,需要将分数线最高设置为多少;
4.从现在报考的学生来看,如果分数线设置为x,能有几名学生被录取。
第一行先输入一个n,表示有n次操作或查询;
接下来n行,每行输入两个整数opt和x(用空格隔开):
如果opt为1,则增加一名报考学生,报考学生成绩为x;
如果opt为2,则表示一名成绩为x的学生放弃报考。
如果opt为3,从现在报考的学生来看,老师想知道如果要招生至少x名学生,需要将分数线最高设置为多少,输出最高分数线。
如果opt为4,从现在报考的学生来看,如果分数线设置为x,能有几名学生被录取,输出录取人数。
对于每个输出占一行。
n不超过50000;0<=x<=1000000;1<=k<=现在的学生数。
Input
第一行输入一个n,接下来n行,每行输出两个整数opt,x,用空格隔开
Output
对于每次输出, 输出一个整数占一行
据说正解是线段树平衡树Treap什么之类的,不懂不懂
下面代码:
opt==3部分 可以直接访问v[num]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 vector<int>v; 2 vector<int>::iterator it; 3 4 int main() 5 { 6 int n,x,opt; 7 cin>>n; 8 int cnt=0; 9 while(n--) 10 { 11 scanf("%d%d",&opt,&x); 12 if(opt==1) 13 { 14 cnt++; 15 v.insert(lower_bound(v.begin(),v.end(),x) ,x); 16 /*for(it=v.begin();it!=v.end();it++) 17 { 18 cout<<*it<<' '; 19 }*/ 20 } 21 else if(opt==2) 22 { 23 cnt--; 24 v.erase( lower_bound(v.begin(),v.end(),x) ); 25 /*for(it=v.begin();it!=v.end();it++) 26 { 27 cout<<*it<<' '; 28 }*/ 29 } 30 else if(opt==3) 31 { 32 int num=cnt-x; 33 for(it=v.begin();it!=v.end();it++) 34 { 35 if(num==0) 36 { 37 cout<<*it<<endl; 38 break; 39 } 40 num--; 41 } 42 } 43 else if(opt==4) 44 { 45 int cant; 46 cant=lower_bound(v.begin(),v.end(),x)-v.begin(); 47 cout<<cnt-cant<<endl; 48 } 49 } 50 } 51 /************************************************************** 52 Problem: 4405 53 User: ys1810z17 54 Language: C++ 55 Result: Accepted 56 Time:664 ms 57 Memory:1464 kb 58 ****************************************************************/