Description

一年一度的西科拔河比赛要到了,比赛要求每只队伍的人数不超过cc人。qwy希望从ACM集训队选择尽可能多的人组成一支队伍去参加比赛。

众所周知,ACM集训队人数众多,每个队员不一定认识其他所有队员。程序猿是一种群居动物,他们不希望和不认识的人一起活动(如果A认识B,B认识C,那么可以认为A认识C)。如果A不认识B,那么A和B都不希望和对方组队参赛,并且程序猿希望和所有他认识的人一起参赛。集训队现在有nn个程序猿,编号1−n1−n。qwy现在有一张关系表,表上有mm条关系,每条关系包含两个整数XiXi和YiYi,表示XiXi和YiYi认识。现在qwy想知道,在每个人数限制cc下,他能派出的人数最多的队伍的信息,即队伍的人数和队长(队中编号最大的程序猿)编号。

Input

Output

对每个询问c,输出一行。 如果没有队伍可以选择输出-1。 如果有选择,输出最优选择下的队伍信息,即队伍人数和队伍中队长的编号。 如果有多个选择,输出队长编号最大的那个队伍的信息。

  • Sample Input
  • Raw

6 3 4 1 3 3 2 5 6 0 1 2 3

  • Sample Output
  • Raw

-1 1 4 2 6 3 3

Hint

对于第一个样例,只能分为三个队伍:{1,2,3},{4},{5,6}. 第一个询问0,qwy并不能找到一支队伍,人数小于等于0,所以输出-1。 第二个询问1,只能找到{4}这个队伍,队伍信息为(1,4)即1个人,其中队长编号为4。 第三个询问2,输出队伍{5,6}的信息。 第四个询问3。输出队伍{1,2,3}的信息。

PS:这是一个典型的并查集的题,但是因为询问次数很多,所以要预处理,或者后面用二分查找找答案。下面给出两种代码:

结构体保存+二分查找:

#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<stack>
#include<string>
const int maxn=2e5+10;
const int mod=1e9+7;
const int inf=1e8;
#define me(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
struct node
{int x,i;bool friend operator<(node a,node b){if(a.x==b.x)return a.i<b.i;return a.x<b.x;}
}a[maxn];
int root[maxn];
int find(int x)
{if(x==root[x])return x;return root[x]=find(root[x]);
}
void un(int x,int y)
{int x1=find(x),y1=find(y);if(x1!=y1)root[min(x1,y1)]=max(x1,y1);
}
int er(int l,int r,int c)
{int mid;while(l<=r){mid=(l+r)>>1;if(a[mid].x<=c&&a[mid+1].x>c)break;if(a[mid].x>c)r=mid-1;elsel=mid+1;}return mid;
}
int main()
{int m,n,q;cin>>n>>m>>q;for(int i=1;i<=n;i++)root[i]=i;for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);un(x,y);}me(a,0);for(int i=1;i<=n;i++){a[find(i)].x++;a[find(i)].i=find(i);}sort(a+1,a+n+1);while(q--){int c;scanf("%d",&c);int x=er(1,n,c);if(!a[x].x||a[x].x>c)printf("-1\n");elseprintf("%d %d\n",a[x].x,a[x].i);}return 0;
}

map记录+lower_bound

#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<stack>
#include<string>
const int maxn=2e5+10;
const int mod=1e9+7;
const int inf=1e8;
#define me(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
int root[maxn],pos[maxn],val[maxn];
void inct(int n)
{for(int i=1;i<=n;i++)root[i]=i,val[i]=1;
}
int find(int x)
{if(x==root[x])return x;return root[x]=find(root[x]);
}
void un(int x,int y)
{int x1=find(x),y1=find(y);if(x1!=y1){root[min(x1,y1)]=max(x1,y1);val[max(x1,y1)]+=val[min(x1,y1)];}
}
int main()
{int m,n,q;cin>>n>>m>>q;inct(n);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);un(x,y);}map<int,int>s;int l=0;for(int i=1;i<=n;i++){if(root[i]==i){pos[l++]=val[i];s[val[i]]=i;}}sort(pos,pos+l);while(q--){int c;scanf("%d",&c);int x=lower_bound(pos,pos+l,c)-pos;if(pos[x]==c)printf("%d %d\n",pos[x],s[pos[x]]);else if(x<1)printf("-1\n");elseprintf("%d %d\n",pos[x-1],s[pos[x-1]]);}return 0;
}

power oj 2825: 拔河大赛(并查集)相关推荐

  1. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有 ...

  2. 安科 OJ 1190 连接电脑 (并查集)

    时间限制:1 s 空间限制:128 M 传送门:https://oj.ahstu.cc/JudgeOnline/problem.php?id=1190 题目描述 机房里有若干台电脑,其中有一些电脑已经 ...

  3. 并查集练习(0743) SWUST OJ

    #include<iostream> #include<cstring> using namespace std; int a[1000005]; int n,m,l,ci,d ...

  4. 海贼OJ并查集练习题:朋友圈

    海贼OJ并查集练习题:朋友圈 题目描述 ​ 所谓一个朋友圈子,不一定其中的人都互相直接认识. ​ 例如:小张的朋友是小李,小李的朋友是小王,那么他们三个人属于一个朋友圈. ​现在给出一些人的朋友关系, ...

  5. hrbust 哈理工oj 1418 夏夜星空【带权并查集】

    夏夜星空 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 43(20 users) Total Accepted: 19(18 user ...

  6. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  7. 【bzoj 入门OJ】[NOIP 热身赛]Problem C: 星球联盟(并查集)

    Problem C: 星球联盟 Time Limit: 4 Sec  Memory Limit: 256 MB Submit: 57  Solved: 15 [Submit][Status][Web ...

  8. 并查集——NUIST OJ P1648 炼丹术为例

    并查集 定义:并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题 主要构成: 并查集主要由一个整型数组pre[]和两个函数find().join()构成. 数组pre[]记录了每个点的 ...

  9. PIPI OJ 1118: 继续畅通工程(并查集+最小生成树)

    菜鸟生成记(18) 1118: 继续畅通工程 又双叒叕是最短路径的水题;不同的是,在构造最小生成树前,题目中已经规定一些已经建好了(这些边已经在生成树里面了);从未建好的边中选择最优边加入生成树;直到 ...

  10. 算法:程序设计之并查集

    前言 之前一直都是听说并查集,感觉是一个神乎其技,狂拽酷炫.却没有想过在自己学习并查集之前,自已在解决问题的时候也能够想到一个和并查集异曲同工的方法.这个还是很愉快的. 版权说明 著作权归作者所有. ...

最新文章

  1. 重磅!2022QS世界大学排名公布!
  2. 例5.12 输入一串字符,字符个数不超过100,且以.结束。 (信息学奥赛一本通)...
  3. 对commonMark.js的理解学习
  4. 转载:谢谢原作者:块设备驱动实战基础篇三 (BIO请求回调机制)
  5. It feels great to know you learned something, isn‘t it?
  6. 【史上最详细】动态规划:矩阵连乘问题(C++实现,含备忘录方法)
  7. Dapper防sql注入,同一条SQL支持多种数据库
  8. day16-Dom提交表单以及其他
  9. C++菱形继承逆向分析
  10. 微光app电脑版_有哪些适合学生使用的 App?②
  11. 直播源列表转换php,电视直播源列表制作、转换工具Telelist(可以DPL、M3U、TXT等互转)...
  12. java基础核心总结归纳---参考手册
  13. uctools.php,Discuz曝出安全隐患 XSS脚本漏洞和uctools.php
  14. 5G NR标准协议架构-5G协议应该怎么看?
  15. 导出的excel添加水印
  16. 腾讯 纸牌游戏 (排序)
  17. MFC制作Windows画图程序(二)
  18. 【Unity3d】 制作游戏主菜单 GUI
  19. 3.4 等价矩阵 VS. 等价向量组
  20. 基于NNEWN NSR3588开发板Android12系统实现四屏异显

热门文章

  1. 【kafka源码】TopicCommand之alter源码解析(分区扩容)
  2. 计算机系统运行费,关于同意计算机离港系统实行收费的批复
  3. 三插头内部结构图_三孔插座内部结构
  4. PS4 5.05安装Linux系统,PS4主机刷机教程以及游戏安装教程,到5.05 4.55 4.05等系统
  5. Android 真实 简历
  6. 计算机网络无法连接共享打印机驱动,Windows 10 安装网络共享打印机失败,提示0x00009c4a 无法连接到打印机解决办法...
  7. ppt文件太大怎么压缩?
  8. 做好的ppt太大怎么变小
  9. Windows(多)操作系统启动过程
  10. 浅聊使用PHP实现微信公众号登录