分析

构造方法

(截图自UOJ群)

可以使用std::set维护这个过程,不过据说可以做到\(O(n+m)\)。。

正确性证明

题目中的要求等价于\((p+1)(q+1) > n\)

设每次找出地度数最小的点的被删除时的度数分别为\(d_1,d_2,...,d_q\),显然用这些点可以构造出一个尴尬度为\(q\)的方案。

并且,我们有:

\[\sum_{i=1}^{q}(d_i+1) = n
\]

考虑这个度数序列取到最大值的位置,可以发现用这个点以及在这个点之后删除的点能够构造出一个热闹度为\(\max d\)的方案。

根据上面那个式子,显然有:

\[(\max d+1) \times q \geq n
\]

所以:

\[(\max d+1) \times (q+1) > n
\]

正确性得证。

代码

  1. #include <bits/stdc++.h>
  2. #define rin(i,a,b) for(int i=(a);i<=(b);++i)
  3. #define irin(i,a,b) for(int i=(a);i>=(b);--i)
  4. #define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
  5. #define Size(a) (int)a.size()
  6. #define pb push_back
  7. #define mkpr std::make_pair
  8. #define fi first
  9. #define se second
  10. #define lowbit(a) ((a)&(-(a)))
  11. typedef long long LL;
  12. using std::cerr;
  13. using std::endl;
  14. inline int read(){
  15. int x=0,f=1;char ch=getchar();
  16. while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
  17. while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
  18. return x*f;
  19. }
  20. const int MAXN=10005;
  21. const int MAXM=100005;
  22. int n,m,ecnt,head[MAXN],deg[MAXN];
  23. int len,seq[MAXN];
  24. int cnt1,cnt2,sat[MAXN],sun[MAXN];
  25. bool vis[MAXN];
  26. struct Edge{
  27. int to,nxt;
  28. }e[MAXM<<1];
  29. inline void add_edge(int bg,int ed){
  30. ++ecnt;
  31. e[ecnt].to=ed;
  32. e[ecnt].nxt=head[bg];
  33. head[bg]=ecnt;
  34. }
  35. struct node{
  36. int pos,deg;
  37. inline friend bool operator < (node x,node y){
  38. return x.deg==y.deg?x.pos<y.pos:x.deg<y.deg;
  39. }
  40. }a[MAXN];
  41. std::set<node> st;
  42. typedef std::set<node>::iterator iter;
  43. void clear(){
  44. ecnt=len=cnt1=cnt2=0;
  45. memset(head,0,sizeof head);
  46. memset(deg,0,sizeof deg);
  47. memset(vis,false,sizeof vis);
  48. }
  49. int main(){
  50. int T=read();
  51. while(T--){
  52. clear();
  53. n=read(),m=read();
  54. rin(i,1,n)a[i]=(node){i,0};
  55. rin(i,1,m){
  56. int u=read(),v=read();
  57. add_edge(u,v);
  58. add_edge(v,u);
  59. ++deg[u];
  60. ++deg[v];
  61. ++a[u].deg;
  62. ++a[v].deg;
  63. }
  64. rin(i,1,n)st.insert(a[i]);
  65. int maxdeg=-1,maxi=0;
  66. while(!st.empty()){
  67. int x=st.begin()->pos;
  68. if(deg[x]>maxdeg){
  69. maxdeg=deg[x];
  70. maxi=len;
  71. }
  72. st.erase(st.begin());
  73. seq[++len]=x;
  74. sun[++cnt2]=x;
  75. vis[x]=true;
  76. trav(i,x){
  77. int y=e[i].to;
  78. iter it=st.find((node){y,deg[y]});
  79. if(it==st.end())continue;
  80. st.erase(it);
  81. seq[++len]=y;
  82. trav(j,y){
  83. int ver=e[j].to;
  84. iter it=st.find((node){ver,deg[ver]});
  85. if(it==st.end())continue;
  86. st.erase(it);
  87. st.insert((node){ver,--deg[ver]});
  88. }
  89. }
  90. }
  91. rin(i,maxi+1,len)sat[++cnt1]=seq[i];
  92. printf("%d ",cnt1);
  93. rin(i,1,cnt1)printf("%d ",sat[i]);
  94. putchar('\n');
  95. printf("%d ",cnt2);
  96. rin(i,1,cnt2)printf("%d ",sun[i]);
  97. putchar('\n');
  98. }
  99. return 0;
  100. }

[洛谷P5361][SDOI2019]热闹又尴尬的聚会:构造题的更多相关文章

  1. [SDOI2019]热闹又尴尬的聚会 构造,贪心

    [SDOI2019]热闹又尴尬的聚会 链接 luogu loj 思路 第一问贪心?的从小到大删除入度最小的点,入度是动态的,打个标记. 当然不是最大独立集. 第二问第一问的顺序选独立集,不行就不要.选 ...

  2. 【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会

    原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个 ...

  3. SDOI2019热闹又尴尬的聚会

    P5361 [SDOI2019]热闹又尴尬的聚会 出题人用脚造数据系列 只要将\(p\)最大的只求出来,\(q\)直接随便rand就能过 真的是 我们说说怎么求最大的\(p\),这个玩意具有很明显的单 ...

  4. [SDOI2019] 热闹又尴尬的聚会

    热闹度\(p\)子图中最小的度数,尴尬度\(q\)独立集大小,之间的约束 \[ \begin{aligned} \lfloor n/(p+1)\rfloor\le q &\rightarrow ...

  5. [SDOI2019]热闹又尴尬的聚会(图论+set+构造)

    据说原数据可以让复杂度不满的暴力O(Tn^2)过掉……O(Tn^2)方法类似于codeforces一场div2的E题 有一种比较好的方法:每次找出原图G中度最小的点加入q,然后将相邻的点加入新图G'. ...

  6. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  7. 洛谷 P1876 开灯(思维,枚举,规律题)

    P1876 开灯 题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编 ...

  8. 洛谷 P2622 关灯问题II(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...

  9. 洛谷 p1164 小A点菜 【dp(好题)】 || 【DFS】 【恰好完全装满】

    题目链接:https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. u ...

随机推荐

  1. 第1章 Java开发入门

    一.填空题 1.Java SE.Java EE.Java ME 2.JRE 3.javac 4.bin 5.path.-class path 二.判断题 1.√ 2.× JDK: java devel ...

  2. 【计算机网络】-介质访问子层-(信道划分介质访问控制&随机访问介质访问控制)

    [计算机网络]-介质访问子层-概述 介质访问控制子层功能 解决信道争用的协议,即用于多路访问信道上确定下一个使用者的协议 是数据链路层协议的一部分 介质访问控制子层位置 位于数据链路层的底部! 信道分 ...

  3. k8s 1.9安装

    关闭所有节点的selinux.iptables.firewalld systemctl stop iptables systemctl stop firewalld systemctl disable ...

  4. Flask-migrate基本使用方法

    数据库迁移操作顺序: 1.python 文件 db init 2.根据需求修改模型 3.python flaskapp文件 db migrate -m"新版本名(注释)" 4.py ...

  5. 4种常用的Ajax请求方式

    在jQuery中,AJAX常见的请求方式主要有一下4种: 1.$.ajax()返回其创建的 XMLHttpRequest 对象 $.ajax() 只有一个参数:参数key/value对象,包含各配置及 ...

  6. 帝国cms 反馈

    <form name='feedback' method='post' enctype='multipart/form-data' action='/e/enews/index.php' ons ...

  7. 转 eclipse 快捷键

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...

  8. c++MMMMM:oo

    1.union,struct和class的区别

  9. nodejs在Mac下的卸载

    卸载: 在 node 官网上下载的安装包,用安装包安装的node.应该可以用一下命令行卸载: 在终端输入以下命令: sudo rm -rf /usr/local/{bin/{node,npm},lib ...

  10. 免费数学神器Mathpix发布移动版了,一起来写更快的公式

    目录 1. 按 2. 下载地址 3. 介绍和使用 3.1. 介绍 3.2. 实际使用体验 1. 按 本文介绍的Mathpix可用于将手写的公式通过拍照或截图转成LaTeX 表达式. 写博客.记笔记最麻 ...