分析

构造方法

(截图自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. C++练习 | 基于栈的中缀算术表达式求值(double类型

    #include<iostream> #include<stack> #include<cmath> using namespace std; char ch; b ...

  2. Hive 教程(五)-参数配置

    配置基本操作 hive> set; 查看所有配置hive> set key: 查看某个配置hive> set key value: 设置某个配置 我们可以看到一些 hadoop 的配 ...

  3. leecode刷题(28)-- 二叉树的前序遍历

    leecode刷题(28)-- 二叉树的前序遍历 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 思路 ...

  4. python 中的 [:-1] 和 [::-1]

    1.案例解释 a='python' b=a[::-1] print(b) #nohtyp c=a[::-2] print(c) #nhy #从后往前数的话,最后一个位置为-1 d=a[:-1] #从位 ...

  5. Uncaught SyntaxError: Unexpected identifier

    $.ajax({ //请求头 type:"POST", contentType:"application/x-www-form-urlencoded", url ...

  6. react 不同环境配置不同域名

    npm eject 先将配置文件暴露出来 将scripts中的build文件复制一份,改名为你需要的名字 将其中的 process.env.NODE_ENV 赋值为你需要的环境 在package.js ...

  7. PostgreSQL 按照日期范围查询

    method 1 select * from user_info where create_date >= '2019-05-01' and create_date < '2019-08- ...

  8. pt-archiver配置自动归档

    Mysql的数据归档通常使用percona的pt-archiver.通过shell脚本加crontab可以应对大多数场景下的数据自动归档. 安装 Percona Toolkit的安装不再赘述,请自行搜 ...

  9. Hbase1.4.9的安装

    HBase介绍 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. HB ...

  10. python: 基本数据类型 与 内置函数 知识整理

    列表 list.append(val) #末尾追加,直接改变无返回 list.inert(2,val) #插入到指定位置 list.extend(mylist1) #list会被改变 list2=li ...