题目链接:1037E - Trips

题目大意:有n个人,m天,每天晚上都会有一次聚会,一个人会参加一场聚会当且仅当聚会里有至少k个人是他的朋友。每天早上都会有一对人成为好朋友,问每天晚上最多能有多少人参加聚会。朋友关系不满足传递性。

   相当于有n个点,进行m次加边操作,每次操作后附加一个询问,问最大点集的大小,使得点集中每个点的度数均大于等于k

题解:如果直接边加边询问可能比较麻烦,本着“正难则反”的原则,我们可以将题目转化为,初始有m条边,每次操作是先询问当前的答案,再删去一条边。

   现在我们就可以先考虑,如果给你m条边,问对应的答案是多少,如何求解。这里给出一个定义,称一个人(点)为无用的,当且仅当没有人会因为他参加了聚会而参加聚会,否则称这个人是有用的。对于朋友关系(边)同理,当且仅当没有人会因此朋友关系而加入聚会,这条边才被称为无用

   显然,一个度数小于k的点肯定是无用的,因为他的朋友不到k个,肯定不会去聚会,更不会有人因为他去聚会。接下来我们可以发现,这个点连出去的边也肯定是无用的,理由同上。那既然这些边是无用的了,我们就可以将这些边删去,对应的一些点的度数就会减少,就可能会产生新的“无用点”,这时候我们就要再将这些点以及有连接到这些点的边删去,直至剩下的所有点和边都是有用的。此时,将剩下的这些点全部拿去参加聚会肯定是满足条件的,因此答案就是剩下的点的个数。

   接下来考虑删边的情况,每次删边前先检索这条边是否还存在(即是否还是有用的),如果他已经被当做无用边删除了,则这次操作不会对答案产生影响,继续进行下一次操作。如果这条边还是有用的,则删去这条边,如果删去这条边导致了新的无用点的产生(即出现了度数小于k的点),则删除此点和相关的边,操作方法和预处理时一致。这样做m次之后再输出答案就好了。

代码中s表示有用点的集合,d[i]记录与i相连的有用边的终点的集合

#include<bits/stdc++.h>
using namespace std;
#define N 200001
int n,m,k,x[N],y[N],ans[N];
set<int>d[N],s;
queue<int>q;
int main()
{scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++)scanf("%d%d",&x[i],&y[i]),d[x[i]].insert(y[i]),d[y[i]].insert(x[i]);for(int i=1;i<=n;i++)if(d[i].size()<k)q.push(i);while(!q.empty()){int cur=q.front();q.pop();for(auto nxt:d[cur]){d[nxt].erase(cur);if(d[nxt].size()<k)q.push(nxt);}d[cur].clear();}for(int i=1;i<=n;i++)if(d[i].size()>=k)s.insert(i);for(int i=m;i>=1;i--){ans[i]=s.size();if(d[x[i]].count(y[i])){d[x[i]].erase(y[i]);d[y[i]].erase(x[i]);if(d[x[i]].size()<k)q.push(x[i]);if(d[y[i]].size()<k)q.push(y[i]);}while(!q.empty()){int cur=q.front();q.pop();for(auto nxt:d[cur]){d[nxt].erase(cur);if(d[nxt].size()<k)q.push(nxt);}d[cur].clear(),s.erase(cur);}}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

View Code

转载于:https://www.cnblogs.com/DeaphetS/p/9584564.html

[Manthan, Codefest 18][Codeforces 1037E. Trips]相关推荐

  1. Codeforces 1037E Trips

    原题 题目大意: 有\(n\)个人,起初他们都不是朋友.总共有\(m\)天,每天会有两个人成为朋友.他们计划在晚上出去旅游,对于一个人,有如下两种情况: 1.要么他不出去旅游 2.要么有至少\(k\) ...

  2. Codeforces 1037E. Trips

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

  3. 【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) A】Packets

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 多重背包的二进制优化. 就是将数量x分成接近log2x份 然后这log2x份能组合成1..x内的所有数字. 从而将多重背包转化成01 ...

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

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

  5. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp预处理超集

    传送门 文章目录 题意: 思路: 题意: n≤1e6,ai≤2e6n\le1e6,a_i\le2e6n≤1e6,ai​≤2e6 思路: 由于(aj&ak)(a_j \And a_k)(aj​& ...

  6. Codefest 18 (rated, Div. 1 + Div. 2)-D-Valid BFS--思维--已知bfs序,求是否正确

    Codefest 18 (rated, Div. 1 + Div. 2)-D-Valid BFSvj地址 题意:给你一段bfs序列,让你判断是否正确 思路:先给节点排序(很关键) 我们给每一个的点的邻 ...

  7. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) 题号 题目 知识点 A XORinacci B Uniqueness ...

  8. Trips CodeForces - 1037E

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

  9. Manthan, Codefest 16

    暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void ma ...

最新文章

  1. Kubernetes-基于k8s-v1.14.2安装dashboard-1.10.1
  2. Fragment崩溃后重启
  3. 【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
  4. HBase环境搭建与使用
  5. 教室工资管理系统c语言课程设计csdn,工资管理系统(C编写)
  6. 如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile
  7. Centos 8 安装向日葵(sunloginclient-10.0.0-1)
  8. Word插入高分辨率图片无法显示
  9. 如何更好更快的站在巨人的肩膀上?
  10. 春风十里不如Node中的一股清流
  11. 项目实战-----产品经理要做什么?
  12. ROS2探索(五)intra-process的内部原理
  13. Handlebars的使用方法及技巧
  14. Eclipse安装InUbuntu18和简单使用
  15. jvm垃圾回收之垃圾收集器
  16. 恐龙世界游戏-恐龙百科世界乐园游戏
  17. 【论文阅读】Multimodal Fusion with Co-Attention Networks for Fake News Detection --- 虚假新闻检测,多模态融合
  18. linux scp命令找不到,bashscp:未找到命令的解决方法-linux运维
  19. JQuery、Ajax基础语法
  20. 五种通信总线协议详解

热门文章

  1. JavaScript(转载)
  2. CString工作原理和常见问题分析
  3. shell与 .sh文件与 .bash文件
  4. arcengine 加载地图不显示_地图建筑建模制作与输出
  5. spfa(还不懂--)
  6. (亲测可行)ubuntu16.04+Opencv3.4.3+opencv_contrib3.4.3安装编译全过程
  7. android 提供服务,GitHub - FamliarMan/AndroidServiceProvider: 为模块化提供的一个服务发现库...
  8. list redis 怎样做排行_学 Redis 的 7000 字小结!!!
  9. html中legend设置大小,HTML_如何给 legend 标签设定宽度,我们在做表单的时候经常会使 - phpStudy...
  10. 查询两张表 然后把数据并在一起_工作表数据查询时,类似筛选功能LIKE和NOT LIKE的应用...