在写BC的一个题时碰到了multiset,在这里来写一写
hdu 5596
multiset我把具体用法写到注释里吧......
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 50000 + 40 ;
struct node{
int g,v;
}p[maxn];
int vis[maxn];
multiset<int>s[2];
int main(){
int T,n,m;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d %d",&p[i].g,&p[i].v);
}
//memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
int t;
for(int i=0;i<m;i++){scanf("%d",&t);vis[t]++;}
//sort(se,se+m);
int sum=0;
for(int i=n-1;i>=0;i--){
sum+=vis[i];
p[i].v+=sum;
}
s[0].clear(),s[1].clear();//清空
multiset<int>::iterator it;
for(int i=0;i<n;i++){
int g=p[i].g;
int z=g^1;
if(s[z].size()!=0){
it=s[z].lower_bound(p[i].v);//这个二分查找,鉴于lower_bound的二分查找机理,这里不能用vector来代替,没有大小顺序,没法二分......
s[z].erase(s[z].begin(),it);//删除工作
}
s[g].insert(p[i].v);//插入
}
int ans=(int)s[0].size()+(int)s[1].size();//得到大小
printf("%d\n",ans);
}
}