分析

构造方法

(截图自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
\]

正确性得证。

代码

#include <bits/stdc++.h>

#define rin(i,a,b) for(int i=(a);i<=(b);++i)
#define irin(i,a,b) for(int i=(a);i>=(b);--i)
#define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
#define Size(a) (int)a.size()
#define pb push_back
#define mkpr std::make_pair
#define fi first
#define se second
#define lowbit(a) ((a)&(-(a)))
typedef long long LL; using std::cerr;
using std::endl; inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int MAXN=10005;
const int MAXM=100005; int n,m,ecnt,head[MAXN],deg[MAXN];
int len,seq[MAXN];
int cnt1,cnt2,sat[MAXN],sun[MAXN];
bool vis[MAXN]; struct Edge{
int to,nxt;
}e[MAXM<<1]; inline void add_edge(int bg,int ed){
++ecnt;
e[ecnt].to=ed;
e[ecnt].nxt=head[bg];
head[bg]=ecnt;
} struct node{
int pos,deg;
inline friend bool operator < (node x,node y){
return x.deg==y.deg?x.pos<y.pos:x.deg<y.deg;
}
}a[MAXN]; std::set<node> st;
typedef std::set<node>::iterator iter; void clear(){
ecnt=len=cnt1=cnt2=0;
memset(head,0,sizeof head);
memset(deg,0,sizeof deg);
memset(vis,false,sizeof vis);
} int main(){
int T=read();
while(T--){
clear();
n=read(),m=read();
rin(i,1,n)a[i]=(node){i,0};
rin(i,1,m){
int u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
++deg[u];
++deg[v];
++a[u].deg;
++a[v].deg;
}
rin(i,1,n)st.insert(a[i]);
int maxdeg=-1,maxi=0;
while(!st.empty()){
int x=st.begin()->pos;
if(deg[x]>maxdeg){
maxdeg=deg[x];
maxi=len;
}
st.erase(st.begin());
seq[++len]=x;
sun[++cnt2]=x;
vis[x]=true;
trav(i,x){
int y=e[i].to;
iter it=st.find((node){y,deg[y]});
if(it==st.end())continue;
st.erase(it);
seq[++len]=y;
trav(j,y){
int ver=e[j].to;
iter it=st.find((node){ver,deg[ver]});
if(it==st.end())continue;
st.erase(it);
st.insert((node){ver,--deg[ver]});
}
}
}
rin(i,maxi+1,len)sat[++cnt1]=seq[i];
printf("%d ",cnt1);
rin(i,1,cnt1)printf("%d ",sat[i]);
putchar('\n');
printf("%d ",cnt2);
rin(i,1,cnt2)printf("%d ",sun[i]);
putchar('\n');
}
return 0;
}

[洛谷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. pycharm 更换源 Windows Linux平台

    pycharm 更换源 Windows Linux平台 参考资料:https://blog.csdn.net/wls666/article/details/95456309 Windows下更新源 文 ...

  2. HTML5网页文档结构

    2.1     Web标准 Web标准,使得Web开发更加容易.Web标准由万维网联盟(W3C)制定. 2.1.1          Web标准概述 Web标准的最终目的就是保证每个人都有权力访问相同 ...

  3. Ansible 常用模块详解

    经过前面的介绍,我们已经熟悉了 Ansible 的一些常识性的东西和如何编译安装Ansible,从本章开始我们将全面介绍 Ansible 的各种生产常用模块,这些也是我们使用 Ansible 的过程中 ...

  4. springboot(十八)-session共享

    前言 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是在分布式/集群项目中,Session 共享则是一个必须面对的问题,先看一个简单的架构图: 在这样的架构中 ...

  5. js css3 固定点拖拽旋转

    一.直接上效果图: 然后是代码: 一共两种实现方式: <!DOCTYPE html> <html lang="en"> <head> <m ...

  6. 梳理common-io工具包

    title: 梳理common-io工具包 comments: false date: 2019-08-28 14:21:58 description: 对common-io工具包中的常用类进行整理, ...

  7. docker 环境安装

    centos7下安装docker.docker-compose 参考文档:https://docs.docker.com/ 一.安装docker 1).Docker 要求 CentOS 系统的内核版本 ...

  8. adb进阶知识,如何过滤只查看某一个app的日志

    前面大概学习了adb基础,但是adb的存在,在测试人员中究竟有什么必要,以及看log时,那么多的log,让我们看个屁啊,所以这一次,我决定一定要把adb这件事情搞清楚.   1.先来看最感兴趣的adb ...

  9. SSD源码解读——网络测试

    之前,对SSD的论文进行了解读,可以回顾之前的博客:https://www.cnblogs.com/dengshunge/p/11665929.html. 为了加深对SSD的理解,因此对SSD的源码进 ...

  10. 为何 linux 要用 tar.gz,而不用 7z 或 zip?

    因为 7z 和 zip 压缩格式都不能保留 unix 风格的文件权限,比如解压出个可执行文件要重新 chmod chown 才能恢复正常.而 tar 格式可以.而 tar 本身不提供压缩,无非就是把包 ...