题目链接

思路

首先观察题目最后的式子\(\lfloor \frac{n}{p + 1} \rfloor \le q\) 并且\(\lfloor \frac{n}{q+1} \rfloor \le p\)。

这个式子其实就是告诉我们\(p\)和\(q\)都要尽量大。

然后这道题就可以分成两个小题:

1.求一个子图,使得图中最小度数最大。

2.求最大独立集。

先看第一个问题:

可以贪心的每次将度数最小的点删去。剩下的点中度数最小的那个就是当前图的贡献。然后找一个最大的贡献就是答案。

第二个问题

求一般图的最大独立集。。。不太可能。

但是这个题目的限制并没有这么严格。只要满足\(\lfloor \frac{n}{p + 1} \rfloor \le q\)即可。

每次将度数最小的点加入独立集。然后将与该点所连的点全部删去。

可以发现,这样加到独立集中点的度数一定小于等于\(p\)(否则p就可以更大了)。所以每次最多删去\(p\)个点。最少可以删\(\lceil \frac{n}{p+1} \rceil\)次。也就是说最少可以加入这些点。所以这种做法肯定是满足\(\lfloor \frac{n}{p + 1} \rfloor \le q\)的。

代码

/*
* @Author: wxyww
* @Date: 2019-05-11 14:54:21
* @Last Modified time: 2019-05-11 15:27:46
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 100010;
#define pi pair<int,int>
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
priority_queue<pi,vector<pi>,greater<pi> >q;
struct node {
int v,nxt;
}e[N << 1];
int head[N],ejs;
void add(int u,int v) {
e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
}
int vis[N],du[N],tsd[N],bz[N],ans[N],anss[N];
int main() {
// freopen("day2t1.in","r",stdin);
int T = read();
while(T--) { memset(vis,0,sizeof(vis));
memset(du,0,sizeof(du));
memset(bz,0,sizeof(bz));
ejs = 0;memset(head,0,sizeof(head)); int n = read(),m = read();
for(int i = 1;i <= m;++i) {
int u = read(),v = read();
add(u,v);add(v,u);
du[u]++,du[v]++;
} for(int i = 1;i <= n;++i) tsd[i] = du[i]; for(int i = 1;i <= n;++i) q.push(make_pair(du[i],i)); int ansjs = 0,js = 0,mx = 0;
while(!q.empty()) {
int d = q.top().first,u = q.top().second;
q.pop();
vis[u] = 1;
if(du[u] != d) continue;
if(d > mx) {
// puts("!!!");
// printf("%d\n",js);
mx = d;
ansjs = js;
}
ans[++js] = u;
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
if(vis[v]) continue;
du[v]--;q.push(make_pair(du[v],v));
}
}
memset(vis,0,sizeof(vis));
for(int i = 1;i <= n;++i) q.push(make_pair(tsd[i],i));
js = 0;
while(!q.empty()) {
int u = q.top().second,d = q.top().first;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
anss[++js] = u;
if(d != tsd[u]) continue;
// puts("!!!");
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
// puts("!!!");
if(vis[v]) continue;
vis[v] = 1;
// printf("%d\n",v);
for(int j = head[v];j;j = e[j].nxt) {
int vv = e[j].v;
if(vis[vv]) continue;
--tsd[vv];q.push(make_pair(tsd[vv],vv));
}
}
}
// puts("!!");
for(int i = 1;i <= ansjs;++i) bz[ans[i]] = 1;
printf("%d ",n - ansjs);
for(int i = 1;i <= n;++i) if(!bz[i]) printf("%d ",i);
puts("");
printf("%d ",js);
for(int i = 1;i <= js;++i) printf("%d ",anss[i]);
puts(""); } return 0;
}

vijos2054 SDOI2019 热闹的聚会与尴尬的聚会的更多相关文章

  1. [luogu5361]热闹的聚会与尴尬的聚会

    由于两者是独立的,我们希望两者的$p$和$q$都最大 考虑最大的$p$,先全部邀请,此时要增大$p$显然必须要删去当前度数最小的点,不断删除之后将每一次度数最小值对答案取max即可 对于$q$也即最大 ...

  2. [SDOI2019]热闹又尴尬的聚会 构造,贪心

    [SDOI2019]热闹又尴尬的聚会 链接 luogu loj 思路 第一问贪心?的从小到大删除入度最小的点,入度是动态的,打个标记. 当然不是最大独立集. 第二问第一问的顺序选独立集,不行就不要.选 ...

  3. SDOI2019热闹又尴尬的聚会

    P5361 [SDOI2019]热闹又尴尬的聚会 出题人用脚造数据系列 只要将\(p\)最大的只求出来,\(q\)直接随便rand就能过 真的是 我们说说怎么求最大的\(p\),这个玩意具有很明显的单 ...

  4. 【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会

    原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个 ...

  5. [SDOI2019] 热闹又尴尬的聚会

    热闹度\(p\)子图中最小的度数,尴尬度\(q\)独立集大小,之间的约束 \[ \begin{aligned} \lfloor n/(p+1)\rfloor\le q &\rightarrow ...

  6. [洛谷P5361][SDOI2019]热闹又尴尬的聚会:构造题

    分析 构造方法 (截图自UOJ群) 可以使用std::set维护这个过程,不过据说可以做到\(O(n+m)\).. 正确性证明 题目中的要求等价于\((p+1)(q+1) > n\) 设每次找出 ...

  7. [SDOI2019]热闹又尴尬的聚会(图论+set+构造)

    据说原数据可以让复杂度不满的暴力O(Tn^2)过掉……O(Tn^2)方法类似于codeforces一场div2的E题 有一种比较好的方法:每次找出原图G中度最小的点加入q,然后将相邻的点加入新图G'. ...

  8. SDOI2019 Round2

    这鬼家伙已经咕了好久了-- SDOIR2的题目挺好玩的- 快速查询(???) 不难发现所有的操作都可以通过区间打Tag实现 那么可以维护两个标记\(a,b\)表示序列中的数为\(x\)时实际表示的值是 ...

  9. Solution Set - 《赏竹而格之》

    1.「GXOI / GZOI 2019」「洛谷 P5304」旅行者   Link & Submission.   经典二进制分组,没啥好说的. 2. 「SDOI 2019」「洛谷 P5361」 ...

随机推荐

  1. python实现语音信号处理常用度量方法

    信噪比(SNR) 有用信号功率与噪声功率的比(此处功率为平均功率),也等于幅度比的平方 $$SNR(dB)=10\log_{10}\frac{\sum_{n=0}^{N-1}s^2(n)}{\sum_ ...

  2. git push时出现 Username for 'https://github.com': 仅仅限于github

    使用git push origin master是出现如下问题:Username for 'https://github.com': 解决办法: git remote set-url origin g ...

  3. Appium swipe实现屏幕滑动

    在 Appium 中提供 swipe() 方法来模拟用户滑动屏幕. swipe() 实现过程 是先通过在屏幕上标记两个坐标,然后再从开始坐标移动到结束坐标. 先看下 swipe 方法定义: def s ...

  4. Zabbix图表中文乱码(包含Docker安装乱码)

    目录 Zabbix 4.0 版本 Zabbix 3.0 版本 Zabbix 4.0 Docker 版本 图表乱码问题解决 文章github 地址: 点我 最近在看 Zabbix 4.0 版本的官方文档 ...

  5. yii2.0的学习之旅(一)

    一. 通过composer安装yii2.0项目 *本文是根据您已经安装了composer (1)跳转到项目根目录 cd /xxxx/www (2)下载插件 composer global requir ...

  6. 【USTC】雨

    自九月初来到科大,到现在已经一个月.这几天是国庆假期(祖国七十华诞,祝福祖国),我没有回家,白天在实验室,晚上去找小许. 今天下雨了,不大,但是温度降了大约10度,上次下雨还是九月初开学那几日. 9月 ...

  7. python算法题 python123网站单元四题目

    目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来)   下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...

  8. JavaScript Date 日期属性和方法

    JavaScript 日期(Date) Date对象用于处理日期和时间.使用对象new Date()创建日期.实例化日期有四种方式: var d1 = new Date(); var d2 = new ...

  9. Spring登录实例

    Spring登录实例 项目结构 首先看一下整个项目的目录结构,如下: 导入Jar包 工欲善必先利其器,导入一下Jar包 配置文件 web.xml 配置 web.xml配置文件,如下: xmlns:xs ...

  10. map、filter、reduce函数的使用

    1.filter() 作用:过滤 // 1.筛选出大于30的数. const array = [10, 20, 30, 40, 50, 60, 70, 80] // 普通写法 // let newar ...