[SDOI2019] 热闹的聚会与尴尬的聚会
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] 热闹的聚会与尴尬的聚会相关推荐
- 热闹的聚会与尴尬的聚会_如何增加(和保存)您最喜欢的技术聚会
热闹的聚会与尴尬的聚会 by Jen Weber 詹·韦伯(Jen Weber) 如何增加(和保存)您最喜欢的技术聚会 (How to Grow (and Save) Your Favorite Te ...
- 热闹的聚会与尴尬的聚会_如何在第一次技术聚会上生存(并蓬勃发展)
热闹的聚会与尴尬的聚会 The best advice I received about securing my first job as a web developer was to attend ...
- 热闹的聚会与尴尬的聚会_如何创建成功的聚会小组
热闹的聚会与尴尬的聚会 Meetups are amazing! They are a great way to stay up to date on the latest technologies, ...
- 他乡荆门人2009年终深圳聚会(2010新年聚会)之长篇累牍
一.行程篇 其实我是最近一个多月才加入到论坛和群里的,对于我这种非活跃分子来说,除了儿时就认识的"果冻"还带给我一些真实感,之前对论坛和群的感觉总是虚无缥缈,若有还无的. 像只冬眠 ...
- 计算机毕业设计 SSM同学录管理系统 同学聚会报名系统 在线聚会报名系统Java Vue MySQL数据库 远程调试 代码讲解
- 2019各省省选试题选做
2019各省省选试题选做 2019.05.09 把拖了几天的SDOI Day2更了.姑且算是完结撒花? 省份 Day1T1 Day1T2 Day1T3 Day2T1 Day2T2 Day2T3 ZJO ...
- 多年后的同学聚会,程序员混得最差?
点击视学算法关注我 视学算法,讲述码农的真实人生! 01 视学算法-故事汇 没人知道为什么老班长会把毕业之后.难得一次的聚会订在12月12号这一天,这一天既不是节假日,也不是双休日.在上班和参 ...
- 「杂谈」同学聚会最悲哀的事情
「杂谈」同学聚会最悲哀的事情 大学毕业至今近乎20年了,期间参加过几次规模或大或小的同学聚会,有高中同学会聚会,初中同学聚会,也有大学同学聚会.这些同学聚会上,笔者发现其实体验都还很不错,基本没有发现 ...
- 听说,霸都.NET技术社区准备搞线下聚会了?
.NET Core实战项目交流群 日常交流 嗨,你听说了没有?霸都.NET技术社区准备搞线下聚会了! 啥时候的事情啊? 最近才知道的消息啊! 那你是从哪里知道的消息呢? .NET Core项目实战交流 ...
最新文章
- 整理一周的Python资料,包含各阶段所需网站、项目,2020燥起来!
- 北京清华长庚医院入选“首批74家国家临床教学培训示范中心”(附完整版名单)...
- 又一款4800像素手机曝光:vivo V15 Pro
- Spring中的@ Component,@ Repository和@Service批注有什么区别?
- html限制最多字符串,css – 设置字符串换行中允许的最大换行量
- 四边偏移lisp_双向偏移lisp
- 剑指offer--求1+1+3+....n的和
- C语言满分代码:1018 锤子剪刀布 (20分)(解题报告)
- echarts格式化tooltip数据
- 第三讲系统的基本操作
- 轻松理解—继承成员访问控制机制
- c语言边序列构造邻接表,结构C语言版期末考试考试(有答案).doc
- android客户端设计,Android客户端设计.ppt
- Session的创建与销毁时机
- Jsoup进阶之获取指定数据
- 如何在OUTLOOK签名中自动加入日期
- matlab 直接馈通,s函数直接馈通
- 51NOD 1278 相离的圆(二分 + 排序 好题)
- 基于W5500的实时远程温湿度监控系统
- C语言人物复杂移动与异步输入
热门文章
- 上班族吐槽大集合:那些发生在公司的傻X奇遇
- 用画小狗的方法来解释Java中的值传递
- idea mysql 创建表_idea 根据数据库表自动创建持久化类
- android listview添加数据_Android面经分享,失业两个月,五一节前拿到offer
- dakai微信小程序 ios_iOSAPP跳转微信小程序
- 名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释
- postgis数据库优化_国内首个 Serverless 数据库来了,技术架构全揭秘!
- mysql安装目录centos_CentOS mysql安装系统方法
- gre考试能用计算机么,新GRE考试必须知道的九大考场问题
- JAVA world转图片,将Kinect深度图像转换为真实世界坐标