Leaving Auction
2024-10-18 23:32:23
Leaving Auction
题目链接:http://codeforces.com/contest/749/problem/D
二分
本来以为是哪种神奇的数据结构,没想到sort+lower_bonud就解决了,妙。
这道题的精髓在于将每个人出价的最大值记录下来,最后竞拍到的一定为没有leave的人中出价最高的那个人(因为It's guaranteed that the sum of k over all question won't exceed 200 000. 所以这个操作的总复杂度不会超过200 000)。而这个人的最低出价,只需要比第二个人的最高出价高即可,此操作可以用二分。//最后不得不说scanf和cin在没有关同步之前,差别真的很大...
代码如下:
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <set>
#define pb(x) push_back(x)
#define N 200005
using namespace std;
int n,q,k,t,biggest[N],person[N];
vector<int>man[N];
bool cmp(int a,int b){
return biggest[a]<biggest[b];
}
int main(void){
scanf("%d",&n);
for(int i=;i<=n;++i){
int a,b;
scanf("%d%d",&a,&b);
man[a].pb(b);
biggest[a]=b;
person[i]=i;
}
sort(person+,person++n,cmp);
scanf("%d",&q);
while(q--){
set<int>leave;
scanf("%d",&k);
for(int i=;i<k;++i){
scanf("%d",&t);
leave.insert(t);
}
int temp[],num=;
temp[]=temp[]=;
for(int i=n;i>=;--i){
if(leave.count(person[i]))continue;
temp[num++]=person[i];
if(num==)break;
}
if(man[temp[]].size()==){
printf("0 0\n");
continue;
}
if(num==){
int it=*lower_bound(man[temp[]].begin(),man[temp[]].end(),biggest[temp[]]);
printf("%d %d\n",temp[],it);
}else if(num==){
printf("%d %d\n",temp[],man[temp[]][]);
}
}
}
最新文章
- 原: 安装VMtools过程流水帐
- List, Set, Map是否继承自Collection接口?
- for循环往Oracle中插入n条数据,主键自增
- 一步一步学习C++
- mac下安装pcntl
- MySQL - 启停服务
- c++模板实现抽象工厂
- Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值
- 用ATL和MFC来创建ActiveX控件
- iOS开发—— UIImagePickerController获取相册和拍照
- WP8.1开发中关于媒体(图片)文件的生成操作,属性如何设置(内容/嵌入资源等);
- Cygwin-Cygwin ssh Connection closed by ::1 出错
- Node.js的下载、安装、配置、Hello World、文档阅读
- Java canlendar task
- Tomcat Getshell
- Android Studio NDK JNI动态注册本地方法
- 第十八节,TensorFlow中使用批量归一化(BN)
- C++11模版元编程
- httpd
- C#代理多样性