[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」 ...
随机推荐
- 感恩笔记之SQL语句操纵数据集基本功能模板
SQL查询_基本功能 一 SQL语句整体架构 SELECT --1 查询数据表 INTO --2 新建数据表 FROM --3 查询数据表 WHERE --4 筛选数据表 ORDER BY --5 排 ...
- RobotFramework+Selenium如何提高脚本稳定性
通过RF来跑selenium的脚本,正常运行一遍都没有问题,但如果要多次运行,提高脚本的稳定性,那么应该如何做呢? 当然有时候最简单最简单的方法就是直接通过sleep来等待,虽然简单粗暴,但会带来 ...
- 试题 算法训练 区间k大数查询 java题解
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正 ...
- ShutdownHook原理
微信搜索"捉虫大师",点赞.关注是对我最大的鼓励 ShutdownHook介绍 在java程序中,很容易在进程结束时添加一个钩子,即ShutdownHook.通常在程序启动时加入以 ...
- AgileConfig 轻量级配置中心 1.5 发布 - 支持多环境配置
AgileConfig 从发布到现在,收到不同学的 issue 说需要多环境的支持.也就是一个应用在不同的环境下可以配置不同的配置项.这是一个非常有用的功能,就跟我们开发的时候会设置多个 appset ...
- cunda 常用命令,删除,创建,换源
https://github.com/tensorflow/tensorflow/ conda create --name [虚拟环境名] python=3.7 创建一个环境 conda activa ...
- 5.29日 Scrum Metting
日期:2021年5月29日 会议主要内容概述:人员调整,xyl同时兼顾前后端:确定表格缩放策略和新图表添加:强调任务分配,总结工作. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的 ...
- 色彩滤镜矩阵(Color Filter Array)
数码相机上的每个象素都带有一个光感应器,用以测量光线的明亮程度.由于光电二极管是只支持单颜色的装置,它不能区别不同波长的光线.因此,数码相机工程师在相机感应器的上部装上了一套镶嵌式的颜色滤镜,一个颜色 ...
- yum history使用详解(某次为解决误卸载软件的回退实验)
[root@localhost ~]# yum history list #查看历史 Loaded plugins: fastestmirror ID | Command line | Date an ...
- set prompt = "任意匹配字符" 当前目录详解
转载:https://blog.csdn.net/alexdream/article/details/6865730 研究了两天的FreeBSD,总是感觉输入提示符那里怪怪的,而且默认的提示符还不带显 ...