原题
题目大意:
有\(n\)个人,起初他们都不是朋友。总共有\(m\)天,每天会有两个人成为朋友。他们计划在晚上出去旅游,对于一个人,有如下两种情况:
1.要么他不出去旅游
2.要么有至少\(k\)个朋友跟他一起出去
其中\(n,m,k\)都会给出
(注意,友谊是非传递性的,比如\(a\)和\(b\)是朋友,\(b\)和\(c\)是朋友,但\(a\)和\(c\)不一定是朋友)
你的任务是,对于\(1\)到\(m\)天,输出每天晚上最多可以出去玩的人数
首先,我们将题目抽象为一张无向图,问题转化为可以动态加边,在某一刻时最多能选多少个点,\(s.t.\)被选的点中任意一点都与其他被选的点有至少\(k\)条连边。
正向不太好做,我们可以逆向考虑:
首先把所有的边都加进来。显然此时度数还小于\(k\)的点是不可能对答案有贡献了,因此要删去,同时更新一下与它相邻的点的度数。重复以上操作,直到所有点的度数都大于等于\(k\)。此时剩余点的数量就是第\(m\)天时的答案。然后我们倒着删边,并重复上述操作,然后记录一下这一天的答案。最后注意一下输出顺序就OK啦!
代码不长:

#include <bits/stdc++.h>using namespace std;#define N 200000int n, m, k, from[N+5], to[N+5], deg[N+5], del[N+5], ans[N+5], cnt; //del是删除标记
set<int> G[N+5]; //存图void d(int u) { //删除if(del[u] || deg[u] >= k) return ; //显然要返回嘛queue<int> q;q.push(u); //准备开始更新del[u] = 1;--cnt; //更新答案while(!q.empty()) {int x = q.front(); q.pop();for(auto v : G[x]) { //请食用c++11--deg[v]; //因为这个点被删除了,相当于它与相邻点的连边也没了,因此要把相邻点的度数减去1if(deg[v] < k && !del[v]) {q.push(v);  //准备下一次更新del[v] = 1;--cnt; //更新答案}}}
}int main() {ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> m >> k;cnt = n;for(int i = 1, x, y; i <= m; ++i)cin >> x >> y, from[i] = x, to[i] = y, deg[x]++, deg[y]++, G[x].insert(y), G[y].insert(x);for(int i = 1; i <= n; ++i) d(i);ans[m] = cnt; //记录答案for(int i = m; i >= 1; --i) {if(!del[from[i]]) --deg[to[i]]; //注意,这里要特判一下,因为若连边的某一端被删除了,那另一端的度数一定已经被减掉1了if(!del[to[i]]) --deg[from[i]];G[from[i]].erase(to[i]), G[to[i]].erase(from[i]);d(from[i]), d(to[i]); //尝试删除ans[i-1] = cnt; //记录答案}for(int i = 1; i <= m; ++i) cout << ans[i] << endl;return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/9588673.html

Codeforces 1037E Trips相关推荐

  1. [Manthan, Codefest 18][Codeforces 1037E. Trips]

    题目链接:1037E - Trips 题目大意:有n个人,m天,每天晚上都会有一次聚会,一个人会参加一场聚会当且仅当聚会里有至少k个人是他的朋友.每天早上都会有一对人成为好朋友,问每天晚上最多能有多少 ...

  2. Codeforces 1037E. Trips

    STL的强大不得不服,应该还有更优的做法 倒着查询,刚开始把所有边和点都考虑在内,之后依次从后往前删边,然后删除不符条件的点 重点在于如何删除不符合条件的点,我用set<pair<int, ...

  3. Codeforces 1037E Trips 图论,人类智慧

    文章目录 题意 题解 题目链接 题意 每天早上有两人成为朋友,朋友之间不会传递;每天晚上举行一次聚会,对每个人来说他如果参加聚会,则不少于 k k k个他的朋友必须参加聚会.问每天晚上能参加聚会的最多 ...

  4. Trips CodeForces - 1037E

    http://codeforces.com/contest/1037/problem/E 逆向考虑 先拓扑把度数小于k的点入队列松驰其他点 最后剩下的点的数量就是最后一次查询的答案 然后逆向枚举删边 ...

  5. Codeforces - Trips

    题目链接:Codeforces - Trips 加边不好想,所以我们直接反向删边. 每次删除一条边,那么对应两个点的度都减1,每次都把度小于k的删掉,剩下的点就是答案. 删点直接标记即可,删边在set ...

  6. Codeforces 605E :Intergalaxy Trips

    传送门 题解: 如果知道最终的大小关系就比较好做. 不过我们发现最后如果确定了大小关系,那么大的只会从小的转移过来.那么我们现在从小到大逐个确定就好了. #include <bits/stdc+ ...

  7. codeforces #274 C. Riding in a Lift dp+前缀和优化

    codeforces #274  C. Riding in a Lift   dp+前缀和优化 Imagine that you are in a building that has exactly  ...

  8. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  9. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

最新文章

  1. Thinkphp----------为什么Thinkphp会默认进入Index控制器的index方法
  2. 4大主流CPU处理器技术架构,不知道就out了!
  3. java配置常量_Java构建时间常量配置
  4. 苏州大学计算机考研复试经验,苏州大学计算机考研复试经验总结.docx
  5. 腾讯视频怎么删除收藏的内容
  6. Bug:No mapping for GET /onepill//swagger-ui.html
  7. win10关闭电池保护模式_近年最稳的Win10更新?Win10 1909值得升级吗
  8. 友盟分享纯图片到微信
  9. Word题库转成Excel题库的方法
  10. 高淇python怎么样_跟着高淇学Python——第一到第三章总结
  11. NSString转GBK编码格式
  12. [Java]介绍|环境|编码|数据类型|String|运算符|标准输入|if语句|循环语句|三元运算符|循环语句|swich语句
  13. 燃气轮机发电系统matlab仿真模型,基于MATLAB的微型燃气轮机发电系统的建模及仿真.doc...
  14. java代码获取本周的开始日期和结束日期,并动态获取前几周的或者后几周的开始日期和结束日期。
  15. 如何减少电脑辐射的危害——电脑族必看!
  16. LayUi使用switch开关,动态的去控制它是否被启用
  17. Flutter高仿微信-第22篇-支付-二维码收款(二维码)
  18. freebsd mysql 配置_FreeBSD#MySQL安装配置
  19. 2020-10-03 Shell编程
  20. debug 进阶 跳过反射以及aop

热门文章

  1. tf.nn.conv2d()函数详解(strides与padding的关系)
  2. 全国省市区Json文件 ,做省市区联动很轻松
  3. android 输入日语 外键盘,日语外来语怎么用键盘输入
  4. Android TTS语音播报
  5. 招聘 | 胡传鹏博士课题组招硕士、博士
  6. 笃定“凡勃仑效应”?索尼可能想错了
  7. 【OpenCV3经典编程100例】(26)2D特征:Shi-Tomasi角点检测goodFeaturesToTrack()函数
  8. jarvis oj level5
  9. 电机控制书籍复习--高性能变频调速及其典型控制系统-马小亮
  10. 冷暖自知 by 张楚