【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会
原题传送门
构造题。
明显p,q都越大越好
我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个点的度,最后找尴尬聚会中度数最大的点,把它及在它之后删除的点加入热闹的聚会的集合中,这时p就是这个点的度数。这时p,q都较大,就珂以过了,正确性我也不会证明
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define N 10005
#define M 100005
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
struct node{
int to,next;
}e[M<<1];
int head[N],cnt;
inline void add(register int u,register int v)
{
e[++cnt]=(node){v,head[u]};
head[u]=cnt;
}
int T,n,m,du[N],ans[N],del[N];
int t[N<<3];
inline int Min(register int x,register int y)
{
return du[x]<du[y]?x:y;
}
inline void build(register int x,register int l,register int r)
{
if(l==r)
{
t[x]=l;
return;
}
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
t[x]=Min(t[x<<1],t[x<<1|1]);
}
inline void modify(register int x,register int l,register int r,register int pos)
{
if(l==r)
return;
int mid=l+r>>1;
if(pos<=mid)
modify(x<<1,l,mid,pos);
else
modify(x<<1|1,mid+1,r,pos);
t[x]=Min(t[x<<1],t[x<<1|1]);
}
int main()
{
T=read();
while(T--)
{
for(register int i=1;i<=n;++i)
ans[i]=del[i]=du[i]=0;
memset(head,0,sizeof(int)*(cnt+1));
cnt=0;
n=read(),m=read();
int tim=0,mx=0,pos=0;
for(register int i=1;i<=m;++i)
{
int u=read(),v=read();
add(u,v),add(v,u);
++du[u],++du[v];
}
build(1,1,n);
while(19260817)
{
int x=t[1];
if(du[x]==inf)
break;
if(du[x]>=mx)
mx=du[x],pos=tim;
ans[x]=1,del[x]=++tim,du[x]=inf;
modify(1,1,n,x);
for(register int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(del[v])
continue;
del[v]=tim,du[v]=inf;
modify(1,1,n,v);
for(register int j=head[v];j;j=e[j].next)
{
int t=e[j].to;
if(del[t])
continue;
--du[t];
modify(1,1,n,t);
}
}
}
vector<int> P,Q;
for(register int i=1;i<=n;++i)
{
if(del[i]>pos)
P.push_back(i);
if(ans[i])
Q.push_back(i);
}
write(P.size()),putchar(' ');
for(register int i=0;i<P.size();++i)
write(P[i]),putchar(' ');
puts("");
write(Q.size()),putchar(' ');
for(register int i=0;i<Q.size();++i)
write(Q[i]),putchar(' ');
puts("");
}
return 0;
}
【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会的更多相关文章
- [洛谷P5361][SDOI2019]热闹又尴尬的聚会:构造题
分析 构造方法 (截图自UOJ群) 可以使用std::set维护这个过程,不过据说可以做到\(O(n+m)\).. 正确性证明 题目中的要求等价于\((p+1)(q+1) > n\) 设每次找出 ...
- SDOI2019热闹又尴尬的聚会
P5361 [SDOI2019]热闹又尴尬的聚会 出题人用脚造数据系列 只要将\(p\)最大的只求出来,\(q\)直接随便rand就能过 真的是 我们说说怎么求最大的\(p\),这个玩意具有很明显的单 ...
- [SDOI2019]热闹又尴尬的聚会 构造,贪心
[SDOI2019]热闹又尴尬的聚会 链接 luogu loj 思路 第一问贪心?的从小到大删除入度最小的点,入度是动态的,打个标记. 当然不是最大独立集. 第二问第一问的顺序选独立集,不行就不要.选 ...
- [SDOI2019] 热闹又尴尬的聚会
热闹度\(p\)子图中最小的度数,尴尬度\(q\)独立集大小,之间的约束 \[ \begin{aligned} \lfloor n/(p+1)\rfloor\le q &\rightarrow ...
- [SDOI2019]热闹又尴尬的聚会(图论+set+构造)
据说原数据可以让复杂度不满的暴力O(Tn^2)过掉……O(Tn^2)方法类似于codeforces一场div2的E题 有一种比较好的方法:每次找出原图G中度最小的点加入q,然后将相邻的点加入新图G'. ...
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...
- vijos2054 SDOI2019 热闹的聚会与尴尬的聚会
题目链接 思路 首先观察题目最后的式子\(\lfloor \frac{n}{p + 1} \rfloor \le q\) 并且\(\lfloor \frac{n}{q+1} \rfloor \le p ...
- 【题解】Luogu P5358 [SDOI2019]快速查询
原题传送门 神鱼说这道题是强制离线(smog 我们珂以把被单点修改,单点查询的点单独拿出来处理,把每个数表示成\(mul*x+plus\) 初始状态下\(mul=1,plus=0\) 操作1:在总和中 ...
- 【题解】Luogu P5360 [SDOI2019]世界地图
原题传送门 每次查询的实际就是将地图的一个前缀和一个后缀合并后的图的最小生成树边权和 我们要预处理每个前缀和后缀的最小生成树 实际求前缀和(后缀和)的过程珂以理解为上一个前缀和这一列的最小生成树进行合 ...
随机推荐
- 如果用了flex去加一个箭头怎么让他剧中
左边是做了一个flex:1 右边是span的display:inline-block样式 父元素 .search-car-arrow display flex align-items center' ...
- linux 如何改变文件属性与权限1
我们知道档案权限对于一个系统的安全重要性,也知道档案的权限对于使用者与群组的相关性, 那如何修改一个档案的属性与权限呢? 我们这里介绍几个常用于群组.拥有者.各种身份的权限的指令.如下所示: chgr ...
- docker-Harbor仓库映像
部署环境: centos-7.2 docker-engine-1.12.5 docker-compose-1.9.0 harbor-0.5.0 1.下载所需的软件包(以下需要-翻-墙-下载的地方你们自 ...
- java并发编程(一)线程状态 & 线程中断 & 线程间的协作
参考文章: Java线程的5种状态及切换:http://blog.csdn.net/pange1991/article/details/53860651 线程的5种状态: 1. 新建(NEW):新创建 ...
- python mysql数据库压力测试
python mysql数据库压力测试 pymysql 的执行时间对比 1,装饰器,计算插入1000条数据需要的时间 def timer(func): def decor(*args): start_ ...
- C# Mysql 查询 Rownum
SELECT @rownum:=@rownum+1 AS rownum,a.order_id ,case when a.Ordered =1 then '已分单' end as Ordered,a.p ...
- x3d
目录 3d format introduction x3d resources open source C++ implementations file formats 1. Feature matr ...
- linux命令(55):环境变量:LIBRARY_PATH 和 LD_LIBRARY_PATH的区别
添加环境变量:https://www.cnblogs.com/lovychen/p/5583703.html PATH是可执行文件的环境变量. LIBRARY_PATH 和 LD_LIBRARY_PA ...
- 【转】Python查找某文件夹下的所有excel文件
# -*- coding: utf-8 -*- # author:baoshan import os dirname = r'D:\0.shenma\01.聊城资料\01.数据资料\02.聊城年鉴数据 ...
- 怎样在sql server profiler跟踪时只显示自己关心的内容
当我们想知道.net程序到底执行了哪些SQL的时候,通常会使用sql server profiler,但是如果不加设置,我们程序执行的sql通常会被系统的SQL淹没,通过以下的方法,可以只显示我们需要 ...