题解:考虑逆序处理询问,用一个set来维护能去的人,每次减少边的时候,维护一下这个set就可以,具体看代码

int main(){
int n, m, k;
cin >> n >> m >> k;
vector<pair<int, int> > Edges(m);
vector<int> Ans(m);
vector<int> degree(n,0);
vector<vector<pair<int, int> > > adj(n);
set<pair<int, int> > Good_set;
vector<int> in_good_set(n, true);
for (int i = 0; i<m; i++){
cin >> Edges[i].first >> Edges[i].second;
Edges[i].first--;
Edges[i].second--;
adj[Edges[i].first].push_back({ Edges[i].second,i });
adj[Edges[i].second].push_back({ Edges[i].first,i });
degree[Edges[i].first]++;
degree[Edges[i].second]++;
}
for (int i = 0; i<n; i++){
Good_set.insert({ degree[i],i });
}
while (!Good_set.empty() && Good_set.begin()->first<k) {
int node = Good_set.begin()->second;
for (auto &y : adj[node]){
int x = y.first;
if (in_good_set[x]){
Good_set.erase({ degree[x],x });
--degree[x];
Good_set.insert({ degree[x],x });
}
}
Good_set.erase({degree[node],node});
in_good_set[node] = false;
} for (int i = m - 1; i >= 0; i--)
{
Ans[i] = Good_set.size(); int u = Edges[i].first, v = Edges[i].second;
if (in_good_set[u] && in_good_set[v])
{
Good_set.erase({ degree[u],u });
--degree[u];
Good_set.insert({ degree[u],u }); Good_set.erase({ degree[v],v });
--degree[v];
Good_set.insert({ degree[v],v }); while (!Good_set.empty() && Good_set.begin()->first<k)
{
int node = Good_set.begin()->second;
for (auto &y : adj[node])
{
int x = y.first;
if (y.second >= i) //非常重要
continue;
if (in_good_set[x])
{
Good_set.erase({ degree[x],x });
--degree[x];
Good_set.insert({ degree[x],x });
}
}
Good_set.erase({degree[node],node});
in_good_set[node] = false;
}
}
}
for (int i = 0; i<m; i++)
cout << Ans[i] << "\n";
}

  

cf1037E的更多相关文章

  1. CF1037E. Trips

    题目链接 CF1037E. Trips 题解 每次删点后,对不满足要求的点拓扑 代码 #include<map> #include<queue> #include<vec ...

  2. cf1037E. Trips(图论 set)

    题意 题目链接 Sol 倒着考虑!倒着考虑!倒着考虑! 显然,一个能成为答案的子图一定满足,其中任意节点的度数\(>= k\) 那么倒着维护就只用考虑删除操作,如果一个点不合法的话就把它删掉,然 ...

  3. CF1037E Trips (离线+图上构造)

    题目大意:一共有n个人,每天早上会有两个人成为朋友,朋友关系不具有传递性,晚上,它们会组织旅游,如果一个人去旅游,那么他不少于$k$个朋友也要和他去旅游,求每天的最大旅游人数 一开始并没有想到反向建图 ...

  4. 连通图,set——cf1037E

    看了题解又调了很久,用set来维护当前满足条件的pair<degree[v],v> 离线操作,先建好一张图,然后建立好集合,每次删边后都把集合里不满足条件的点删去,同时更新集合 /* 离线 ...

  5. CF 板刷总结

    CF 板刷总结 这件事的开始要从万圣节那一天说起.当然,万圣节只用于描述时间,我显然是不参加任何万圣节活动的对吧. 以下是一些我觉得有必要拿出来讲的,有技术含量的题.会持续更新,断更了记得来催更. C ...

随机推荐

  1. SendInput模拟键盘操作

    #include <windows.h> int main() { HWND parentHwnd, childHwnd; INPUT input[4]; parentHwnd = Fin ...

  2. Flink安装及实例教程

    通过本教程我们将快速部署好flink在linux下的环境,并通过flink完成一个小demo的测试 一.准备阶段 flink压缩包下载(1.7.2): http://archive.apache.or ...

  3. The current test process

    样机测试 测试前: 工作内容: 1.需求分析.编写.评审: 项目开工会由项目负责人参加,参加会议时做好笔记,对项目的功能类似,功能模块,测试时间点有个大致的了解. 原始需求进行需求文档细化:按照模块进 ...

  4. 从零开始学习redis源码

    2020的开年是比较艰难的,爆发了肺炎疫情,希望大家多注意安全,也希望疫情早日好转! 以3.2版本的源码为例,开始讲解,有时会贴出源码,进行说明,并会注明源码出处. 数据库 应该都知道默认redis会 ...

  5. [转载]goldendict下优质词典简介及安装

    使用Arch Linux一年以来,如果要问自己最为中意的词典程序是? 当然是Goldendict啦!想详细了解这款瑞士军刀的请猛戳这里. 以前在Win下都是用的lingoes, 感觉还不错,词典库很全 ...

  6. Go语言实现:【剑指offer】旋转数组的最小数字

    该题目来源于牛客网<剑指offer>专题. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3, ...

  7. Shiro权限验证说明

    1.简介 shiro是一个安全框架,是Apache的一个子项目.shiro提供了:认证.授权.加密.会话管理.与web集成.缓存等模块. 1.1.模块介绍 Authentication:用户身份识别, ...

  8. 磁盘文件系统管理与LVM逻辑卷

    一.磁盘以及分区管理 无论是Linux系统还是Windows系统.当现有硬盘的规划不能满足当前需求时.我们就需要将其重新规划和调整 实现上述操作我们就需要用到fdisk磁盘及分区管理工具.此工具是大多 ...

  9. 《Head first设计模式》之迭代器模式

    迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了! 真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃 ...

  10. Enum, Generic and Templates

    文 Akisann@CNblogs / zhaihj@Github 本篇文章同时发布在Github上:https://zhaihj.github.io/enum-generic-and-templat ...