原题传送门

构造题。

明显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;
}

最新文章

  1. MyBatis学习笔记(一)入门
  2. JAVA小知识
  3. Python忽略warning警告错误
  4. ural 1071. Nikifor 2
  5. Java判断文件编码格式
  6. Redhat系列Linux的基础命令
  7. function gzdecode
  8. tyvj1013 - 找啊找啊找GF ——二维背包变种
  9. python主要用来做什么
  10. Appnium移动自动化框架初探
  11. SQL Server 2008 没有可用于 charge_sys_Log.LDF 的编辑器
  12. JavaScript 标识符
  13. ECOS- 技术问题答疑[转]
  14. ligerUI调用$.ligerDialog.open弹出窗口,关闭后无法获取焦点问题
  15. 《mysql必知必会》读书笔记--安全管理及数据库维护
  16. FineUICore已发布,跨平台速度快(现在可申请试用)!
  17. iTOP-i.MX6Q开发板支持安卓Android6.0系统
  18. 微信浏览器安卓手机video浮在最上层问题
  19. 自学web前端能不能找到一份前端的工作吗
  20. MFC列表控件更改一行的字体颜色

热门文章

  1. 【JZOJ5551】【20190625】旅途
  2. linux中的目录
  3. Python逆向(二)—— pyc文件结构分析
  4. 【AtCoder】 ARC 100
  5. ASP.NET,C#后台调用前台javascript的五种方法
  6. 自顶向下深入分析Netty(七)--ChannelPipeline和ChannelHandler总述
  7. springboot(1)@SpringBootApplication
  8. Java NIO 堆外内存与零拷贝
  9. thymeleaf和freemarker比较
  10. IDEA 如何导出 todo 列表