problem

luogu-P5361

他的联系薄上有 nnn 位好友,他们两两之间或者互相认识,或者互相不认识。

小 Q 希望在周六办一个热闹的聚会,再在周日办一个尴尬的聚会。

  • 一场热闹度为 ppp 的聚会请来了任意多位好友,对于每一位到场的好友来说都有至少 ppp 位他认识的好友也参加了聚会,且至少对于一位到场的好友来说现场恰好有 ppp 位他认识的好友;
  • 一场尴尬度为 qqq 的聚会请来了恰好 qqq 位好友,且他们两两互不认识。

两场聚会可能有重复的参与者,联系薄上也有可能有某些好友同时缺席了两场聚会。

小 Q 喜欢周六聚会的热闹度 ppp 与周日聚会的尴尬度 qqq 之间满足:⌊np+1⌋≤q\left\lfloor \frac{n}{p+1} \right\rfloor\le q⌊p+1n​⌋≤q 且 ⌊nq+1⌋≤p\left\lfloor \frac{n}{q+1} \right\rfloor \le p⌊q+1n​⌋≤p。

请帮助小 Q 找出一个可行的邀请方案。

solution

observation1:\text{observation1}:observation1: ⌊np+1⌋≤q∧⌊nq+1⌋≤p⇔(p+1)(q+1)≥n+1\lfloor\frac{n}{p+1}\rfloor\le q\wedge \lfloor\frac{n}{q+1}\rfloor\le p\Leftrightarrow (p+1)(q+1)\ge n+1⌊p+1n​⌋≤q∧⌊q+1n​⌋≤p⇔(p+1)(q+1)≥n+1。

我们只需要分别最大化 p,qp,qp,q 即可。

看似是两个独立的部分,实际上他们各自的构造方式是一样的原理。

  • 热闹的聚会。即度数限制的图。

每次找出当前图中度数最小的点,更新 ppp 的最大值。

并删掉这个点,动态地改变与之相连的其余点的度数。

将弹出的编号桉顺序记录下来,并记下最大值的位置。

位置以前的点则是不被选的。

  • 尴尬的聚会。即独立集。

    每次找出当前图中度数最小的且未被标记的点,加入尴尬的聚会。

    然后标记与之直接相连的所有点都不能参加聚会。

下面给出该构造的正确性证明:

将每个点加入尴尬的聚会,除去这个点本身,最多会从图中删掉 ppp 个点。显然 q≥⌈np+1⌉q\ge \lceil\frac{n}{p+1}\rceilq≥⌈p+1n​⌉。

如果独立集的选点运行了 qqq 次,第 iii 次删掉的点度数为 did_idi​。

则有 ∑i=1q(di+1)≥n\sum_{i=1}^q(d_i+1)\ge n∑i=1q​(di​+1)≥n。而 (q+1)⋅max⁡(di+1)≥n(q+1)·\max(d_i+1)\ge n(q+1)⋅max(di​+1)≥n 显然。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 10005
#define Pair pair < int, int >
int T, n, m;
int p[maxn], q[maxn], vis[maxn], deg[maxn], d[maxn];
vector < int > G[maxn];
priority_queue < Pair, vector < Pair >, greater < Pair > > Q;int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) deg[i] = 0;for( int i = 1;i <= n;i ++ ) G[i].clear();for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );deg[u] ++, deg[v] ++;}int ans1 = 0, cnt1 = 0, pos;for( int i = 1;i <= n;i ++ ) vis[i] = 0;for( int i = 1;i <= n;i ++ ) d[i] = deg[i];for( int i = 1;i <= n;i ++ ) Q.push( make_pair( d[i], i ) );while( ! Q.empty() ) {int u = Q.top().second, w = Q.top().first; Q.pop();if( vis[u] ) continue; vis[u] = 1;p[++ cnt1] = u;if( w > ans1 ) ans1 = w, pos = cnt1;for( int v : G[u] ) if( ! vis[v] ) Q.push( make_pair( --d[v], v ) );}int ans2 = 0, cnt2 = 0;for( int i = 1;i <= n;i ++ ) vis[i] = 0;for( int i = 1;i <= n;i ++ ) d[i] = deg[i];for( int i = 1;i <= n;i ++ ) Q.push( make_pair( d[i], i ) );while( ! Q.empty() ) {int u = Q.top().second, w = Q.top().first; Q.pop();if( vis[u] ) continue;vis[u] = 1;q[++ cnt2] = u;for( int v : G[u] ) vis[v] = 1;}for( int i = 1;i <= n;i ++ ) vis[i] = 0;for( int i = 1;i <= pos;i ++ ) vis[p[i]] = 1;printf( "%d ", n - pos );for( int i = 1;i <= n;i ++ ) if( ! vis[i] ) printf( "%d ", i );puts("");printf( "%d ", cnt2 );for( int i = 1;i <= cnt2;i ++ ) printf( "%d ", q[i] );puts("");}return 0;
}

[SDOI2019] 热闹的聚会与尴尬的聚会相关推荐

  1. 热闹的聚会与尴尬的聚会_如何增加(和保存)您最喜欢的技术聚会

    热闹的聚会与尴尬的聚会 by Jen Weber 詹·韦伯(Jen Weber) 如何增加(和保存)您最喜欢的技术聚会 (How to Grow (and Save) Your Favorite Te ...

  2. 热闹的聚会与尴尬的聚会_如何在第一次技术聚会上生存(并蓬勃发展)

    热闹的聚会与尴尬的聚会 The best advice I received about securing my first job as a web developer was to attend ...

  3. 热闹的聚会与尴尬的聚会_如何创建成功的聚会小组

    热闹的聚会与尴尬的聚会 Meetups are amazing! They are a great way to stay up to date on the latest technologies, ...

  4. 他乡荆门人2009年终深圳聚会(2010新年聚会)之长篇累牍

    一.行程篇 其实我是最近一个多月才加入到论坛和群里的,对于我这种非活跃分子来说,除了儿时就认识的"果冻"还带给我一些真实感,之前对论坛和群的感觉总是虚无缥缈,若有还无的. 像只冬眠 ...

  5. 计算机毕业设计 SSM同学录管理系统 同学聚会报名系统 在线聚会报名系统Java Vue MySQL数据库 远程调试 代码讲解

  6. 2019各省省选试题选做

    2019各省省选试题选做 2019.05.09 把拖了几天的SDOI Day2更了.姑且算是完结撒花? 省份 Day1T1 Day1T2 Day1T3 Day2T1 Day2T2 Day2T3 ZJO ...

  7. 多年后的同学聚会,程序员混得最差?

      点击视学算法关注我   视学算法,讲述码农的真实人生! 01 视学算法-故事汇 没人知道为什么老班长会把毕业之后.难得一次的聚会订在12月12号这一天,这一天既不是节假日,也不是双休日.在上班和参 ...

  8. 「杂谈」同学聚会最悲哀的事情

    「杂谈」同学聚会最悲哀的事情 大学毕业至今近乎20年了,期间参加过几次规模或大或小的同学聚会,有高中同学会聚会,初中同学聚会,也有大学同学聚会.这些同学聚会上,笔者发现其实体验都还很不错,基本没有发现 ...

  9. 听说,霸都.NET技术社区准备搞线下聚会了?

    .NET Core实战项目交流群 日常交流 嗨,你听说了没有?霸都.NET技术社区准备搞线下聚会了! 啥时候的事情啊? 最近才知道的消息啊! 那你是从哪里知道的消息呢? .NET Core项目实战交流 ...

最新文章

  1. 整理一周的Python资料,包含各阶段所需网站、项目,2020燥起来!
  2. 北京清华长庚医院入选“首批74家国家临床教学培训示范中心”(附完整版名单)...
  3. 又一款4800像素手机曝光:vivo V15 Pro
  4. Spring中的@ Component,@ Repository和@Service批注有什么区别?
  5. html限制最多字符串,css – 设置字符串换行中允许的最大换行量
  6. 四边偏移lisp_双向偏移lisp
  7. 剑指offer--求1+1+3+....n的和
  8. C语言满分代码:1018 锤子剪刀布 (20分)(解题报告)
  9. echarts格式化tooltip数据
  10. 第三讲系统的基本操作
  11. 轻松理解—继承成员访问控制机制
  12. c语言边序列构造邻接表,结构C语言版期末考试考试(有答案).doc
  13. android客户端设计,Android客户端设计.ppt
  14. Session的创建与销毁时机
  15. Jsoup进阶之获取指定数据
  16. 如何在OUTLOOK签名中自动加入日期
  17. matlab 直接馈通,s函数直接馈通
  18. 51NOD 1278 相离的圆(二分 + 排序 好题)
  19. 基于W5500的实时远程温湿度监控系统
  20. C语言人物复杂移动与异步输入

热门文章

  1. 上班族吐槽大集合:那些发生在公司的傻X奇遇
  2. 用画小狗的方法来解释Java中的值传递
  3. idea mysql 创建表_idea 根据数据库表自动创建持久化类
  4. android listview添加数据_Android面经分享,失业两个月,五一节前拿到offer
  5. dakai微信小程序 ios_iOSAPP跳转微信小程序
  6. 名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释
  7. postgis数据库优化_国内首个 Serverless 数据库来了,技术架构全揭秘!
  8. mysql安装目录centos_CentOS mysql安装系统方法
  9. gre考试能用计算机么,新GRE考试必须知道的九大考场问题
  10. JAVA world转图片,将Kinect深度图像转换为真实世界坐标