[luogu5361]热闹的聚会与尴尬的聚会
由于两者是独立的,我们希望两者的$p$和$q$都最大
考虑最大的$p$,先全部邀请,此时要增大$p$显然必须要删去当前度数最小的点,不断删除之后将每一次度数最小值对答案取max即可
对于$q$也即最大独立集,并没有很好的解法,但考虑不断加入一个节点$x$,并删去$x$以及与$x$相邻的节点,重复此过程直至原图为空即得到了一个独立集
每一次贪心选择度数最小的节点$x$,显然$x$的度数一定不超过$p$,换言之每一次至多删去$p+1$个节点,最终要删去所有节点,即有$\lceil\frac{n}{p+1}\rceil\le q$
接下来要证明$\lfloor\frac{n}{q+1}\rfloor\le p$,注意到$\lfloor\frac{n}{q+1}\rfloor\le \lceil\frac{n}{q}\rceil-1$,而根据$\lceil\frac{n}{p+1}\rceil\le q$有$\lceil\frac{n}{q}\rceil\le p+1$,即得证
(用了快读+快输还是TLE了一个点)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 set<pair<int,int> >s;
5 vector<int>ans;
6 struct Edge{
7 int nex,to;
8 }edge[N<<1];
9 int E,t,n,m,x,y,a[11],head[N],r[N],rr[N],vis[N];
10 int read(){
11 int x=0;
12 char c=getchar();
13 while ((c<'0')||(c>'9'))c=getchar();
14 while ((c>='0')&&(c<='9')){
15 x=x*10+c-'0';
16 c=getchar();
17 }
18 return x;
19 }
20 void write(int x){
21 a[0]=0;
22 while (x){
23 a[++a[0]]=x%10;
24 x/=10;
25 }
26 for(int i=a[0];i;i--)putchar(a[i]+'0');
27 }
28 void add(int x,int y){
29 edge[E].nex=head[x];
30 edge[E].to=y;
31 head[x]=E++;
32 }
33 int main(){
34 t=read();
35 while (t--){
36 n=read(),m=read();
37 E=0;
38 memset(head,-1,sizeof(head));
39 memset(r,0,sizeof(r));
40 for(int i=1;i<=m;i++){
41 x=read(),y=read();
42 add(x,y);
43 add(y,x);
44 r[x]++,r[y]++;
45 }
46 memcpy(rr,r,sizeof(r));
47 s.clear();
48 memset(vis,0,sizeof(vis));
49 for(int i=1;i<=n;i++)s.insert(make_pair(r[i],i));
50 for(int i=1;i<=n;i++){
51 x=(*s.begin()).second;
52 s.erase(s.begin());
53 vis[x]=i;
54 for(int i=head[x];i!=-1;i=edge[i].nex)
55 if (!vis[edge[i].to]){
56 s.erase(make_pair(r[edge[i].to],edge[i].to));
57 s.insert(make_pair(--r[edge[i].to],edge[i].to));
58 }
59 }
60 for(int i=1;i<=n;i++)r[0]=max(r[0],r[i]);
61 for(int i=1;i<=n;i++)
62 if (r[0]==r[i])x=i;
63 ans.clear();
64 for(int i=1;i<=n;i++)
65 if (vis[i]>=vis[x])ans.push_back(i);
66 write(ans.size());
67 putchar(' ');
68 for(int i=0;i<ans.size();i++){
69 write(ans[i]);
70 putchar(' ');
71 }
72 putchar('\n');
73 memcpy(r,rr,sizeof(r));
74 s.clear();
75 ans.clear();
76 memset(vis,0,sizeof(vis));
77 for(int i=1;i<=n;i++)s.insert(make_pair(r[i],i));
78 while (!s.empty()){
79 x=(*s.begin()).second;
80 s.erase(s.begin());
81 vis[x]=1;
82 ans.push_back(x);
83 for(int i=head[x];i!=-1;i=edge[i].nex)
84 if (!vis[edge[i].to]){
85 vis[edge[i].to]=1;
86 s.erase(make_pair(r[edge[i].to],edge[i].to));
87 for(int j=head[edge[i].to];j!=-1;j=edge[j].nex)
88 if (!vis[edge[j].to]){
89 s.erase(make_pair(r[edge[j].to],edge[j].to));
90 s.insert(make_pair(--r[edge[j].to],edge[j].to));
91 }
92 }
93 }
94 write(ans.size());
95 putchar(' ');
96 for(int i=0;i<ans.size();i++){
97 write(ans[i]);
98 putchar(' ');
99 }
100 putchar('\n');
101 }
102 }
[luogu5361]热闹的聚会与尴尬的聚会的更多相关文章
- vijos2054 SDOI2019 热闹的聚会与尴尬的聚会
题目链接 思路 首先观察题目最后的式子\(\lfloor \frac{n}{p + 1} \rfloor \le q\) 并且\(\lfloor \frac{n}{q+1} \rfloor \le p ...
- [SDOI2019]热闹又尴尬的聚会 构造,贪心
[SDOI2019]热闹又尴尬的聚会 链接 luogu loj 思路 第一问贪心?的从小到大删除入度最小的点,入度是动态的,打个标记. 当然不是最大独立集. 第二问第一问的顺序选独立集,不行就不要.选 ...
- SDOI2019热闹又尴尬的聚会
P5361 [SDOI2019]热闹又尴尬的聚会 出题人用脚造数据系列 只要将\(p\)最大的只求出来,\(q\)直接随便rand就能过 真的是 我们说说怎么求最大的\(p\),这个玩意具有很明显的单 ...
- 【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会
原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个 ...
- [SDOI2019] 热闹又尴尬的聚会
热闹度\(p\)子图中最小的度数,尴尬度\(q\)独立集大小,之间的约束 \[ \begin{aligned} \lfloor n/(p+1)\rfloor\le q &\rightarrow ...
- [洛谷P5361][SDOI2019]热闹又尴尬的聚会:构造题
分析 构造方法 (截图自UOJ群) 可以使用std::set维护这个过程,不过据说可以做到\(O(n+m)\).. 正确性证明 题目中的要求等价于\((p+1)(q+1) > n\) 设每次找出 ...
- [SDOI2019]热闹又尴尬的聚会(图论+set+构造)
据说原数据可以让复杂度不满的暴力O(Tn^2)过掉……O(Tn^2)方法类似于codeforces一场div2的E题 有一种比较好的方法:每次找出原图G中度最小的点加入q,然后将相邻的点加入新图G'. ...
- SDOI2019 Round2
这鬼家伙已经咕了好久了-- SDOIR2的题目挺好玩的- 快速查询(???) 不难发现所有的操作都可以通过区间打Tag实现 那么可以维护两个标记\(a,b\)表示序列中的数为\(x\)时实际表示的值是 ...
- Solution Set - 《赏竹而格之》
1.「GXOI / GZOI 2019」「洛谷 P5304」旅行者 Link & Submission. 经典二进制分组,没啥好说的. 2. 「SDOI 2019」「洛谷 P5361」 ...
随机推荐
- C语言日记① 初识C
概念 c语言是一种计算机语言 也就是人与计算机打交道的语言 在早期,因为计算机使用的二进制 所以早期写代码都是科学家来写的使用对应的功能二进制代码 需要用到手册,所以开发不方便 在后来,人们发明了汇编 ...
- Analysis Tools(分析工具)
分析工具 1.叠加分析 # Process: 交集取反 arcpy.SymDiff_analysis("", "", 输出要素类, "ALL" ...
- js--typeof 和 instanceof 判断数据类型的区别及开发中的使用
前言 日常的开发中,我们经常会遇到判断一个变量的数据类型或者该变量是否为空值的情况,你是如何去选择判断类型的操作符的?本文来总结记录一下我们开发人员必须掌握的关于 typeof 和 instanceo ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- 2020.5.4-ICPC Pacific Northwest Regional Contest 2019
A. Radio Prize All boring tree-shaped lands are alike, while all exciting tree-shaped lands are exci ...
- 这么多TiDB负载均衡方案总有一款适合你
[是否原创]是 [首发渠道]TiDB 社区 前言 分布式关系型数据库TiDB是一种计算和存储分离的架构,每一层都可以独立地进行水平扩展,这样就可以做到有的放矢,对症下药. 从TiDB整体架构图可以看到 ...
- 8086存储器组织和IO组织 奇偶分体
8086的存储器组织 存储器的基本存储单位是字节,每个字节用唯一的地址码表示. 若存放的信息是8位的字节数据,将按顺序存放: 若存放的信息是16位的字数据,则将字的高位字节放在高地址中,低位字节放在低 ...
- Mybatis 二级缓存应用 (21)
[MyBatis 二级缓存] 概述:一级缓存作用域为同一个SqlSession对象,而二级缓存用来解决一级缓存不能夸会话共享,作用范围是namespace级,可以被多个SqlSession共享(只要是 ...
- HCNP Routing&Switching之BGP防环机制和路由聚合
前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ...
- spring social理解
现在互联网飞速发展,人们每天在互联网上冲浪,获取各种信息.各大网站为了方便用户的登录,提供了各式各样的社交登录,比如:QQ.微信和微博登录等.这些主流的社交登录大多是基于oauth协议进行实现,spr ...