这道题主要是运用stl和二分,主要是set的运用可以练一下std。
先用vector存每个人的出价,再用一个数组和set存每个人的最高价,最后对于每一个q,把不在的人从set 里面erase掉,结束后再加进去。erase掉不在的人后,取出出价最高的两个人(set里面的最后两个人),找出价第二高的在最高的人的位置+1,就是出价最高的。
#include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
#define pb(a) push_back(a)
#define fir first
#define se second
#define LL long long
typedef pair<int,int> pii;
const double eps = 0.0000001;
const int maxn = 2e5+5;
int maxp[maxn],p[maxn];
vector<int> num[maxn];
set<pii> mp;
int main() {
int n;
scanf("%d",&n);
clr(maxp,0);
for(int i = 0;i < n;i++) {
int u,v;
scanf("%d%d",&u,&v);
maxp[u] = max(maxp[u],v);
num[u].pb(v);
}
/*for(int i = 1;i <= n;i++)
if(maxp[i]) printf("%d ",maxp[i]);
printf("\n");*/
for(int i = 1;i <= n;i++)
if(maxp[i]) mp.insert(make_pair(maxp[i],i));
int q;
scanf("%d",&q);
set<pii>::iterator it;
set<pii>::reverse_iterator rit;
for(int dd = 1;dd <= q;dd++) {
int x;
scanf("%d",&x);
for(int j = 1;j <= x;j++) {
scanf("%d",&p[j]);
pii tmp;
tmp.se = p[j];tmp.fir = maxp[p[j]];
if(tmp.fir == 0) continue;
it = mp.find(tmp);
mp.erase(it);
}
int len = mp.size();
/*for(it = mp.begin(); it != mp.end(); it++) {
printf("%d-%d\n",it->fir,it->se);
} */
pii a,b;
if(len == 0) printf("0 0\n");
else {
rit = mp.rbegin(); //运用反向迭代器,erase的时候也要处理一下
a = *rit;
mp.erase((++rit).base());
if(len == 1) printf("%d %d\n",a.se,num[a.se][0]);
else {
rit = mp.rbegin();
b = *rit;
mp.erase((++rit).base());
int dd = upper_bound(num[a.se].begin(),num[a.se].end(),b.fir)-num[a.se].begin();
printf("%d %d\n",a.se,num[a.se][dd]);
}
}
for(int j = 1;j <= x;j++) {
pii tmp;
tmp.se = p[j];tmp.fir = maxp[p[j]];
if(tmp.fir == 0) continue;
mp.insert(tmp);
}
if(len) mp.insert(a);
if(len >= 2) mp.insert(b);
}
}