CF749D Leaving Auction(二分)
题意:
给出一些人的拍卖顺序,每次询问删除一些人,谁将拍得商品。输出这个人的编号和他的出价。
当这个人的出价后面没有其他人出过价的时候,就是用这个价格拍下商品。
题解:
每次标记删除的人
查找当前数据结构里的最大出价的持有者
二分这个持有者的所有出价,找到答案
再把删除的人插入数据结构
删除和插入的时间复杂度为logn.
数据结构随意。
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+100; //每次标记删除的人 //查找当前数据结构里的最大出价的持有者 //二分这个持有者的所有出价,找到答案 //再把删除的人插入数据结构 //删除和插入的时间复杂度为logn inline int read () { int x=0; int f=1; char ch=getchar(); while (ch<'0'||ch>'9') { if (ch=='-') f=-1;ch=getchar(); } while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } int n; int a[maxn]; int b[maxn]; int ed[maxn]; int st[maxn]; int t[maxn]; vector<int> g[maxn]; int main () { n=read(); for (int i=1;i<=n;i++) g[i].push_back(-1); vector<pair<int,int> > v; for (int i=1;i<=n;i++) { a[i]=read(),b[i]=read(); g[a[i]].push_back(b[i]); ed[a[i]]=b[i]; } for (int i=1;i<=n;i++) if (g[i].size()>1) v.push_back(make_pair(ed[i],i)); sort(v.begin(),v.end()); int q; q=read(); while (q--) { map<int,int> mp; int k; k=read(); for (int i=1;i<=k;i++) { t[i]=read(); mp[t[i]]=1; } int u=-1; int tt=-1; int f=0; for (int i=v.size()-1;i>=0;i--) { if (!mp[v[i].second]&&!f) { u=v[i].second; f++; } else if (!mp[v[i].second]&&f==1) { tt=v[i].second; break; } } //printf("%d\n",u); if (u==-1) { printf("0 0\n"); continue; } if (tt==-1) { printf("%d %d\n",u,g[u][1]); continue; } int l=1,r=g[u].size()-1; int ans=-1; while (l<=r) { int mid=(l+r)>>1; if (g[u][mid]>=ed[tt]) { ans=g[u][mid]; r=mid-1; } else { l=mid+1; } } printf("%d %d\n",u,ans); } }