题解:考虑逆序处理询问,用一个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. MPlayer参数使用介绍(部分)(中文)

    文件太长,就不全部转载了,以下是某MPlayer网站的全部详细介绍: http://www.mplayer.org.cn/help_zh.html#%E7%A8%8B%E5%BA%8F%E9%94%9 ...

  2. Codeforces 1156E Special Segments of Permutation(启发式合并)

    题意: 给一个n的排列,求满足a[l]+a[r]=max(l,r)的(l,r)对数,max(l,r)指的是l到r之间的最大a[p] n<=2e5 思路: 先用单调栈处理出每个点能扩展的l[i], ...

  3. codeforces 540D Bad Luck Island (概率DP)

    题意:会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率 设状态dp(i,j,k)为还有i个石头,j个剪刀,k个布时的概率,dp(r,s,p ...

  4. C语言寒假大作战04

    问题 答案 这个作业属于那个课程 https://edu.cnblogs.c0m/campus/zswxy/CST2019-4 这个作业的要求在哪里 https://edu.cnblogs.com/c ...

  5. 详解c++中对二维数组下标[][]的重载

    首先定义一个矩阵类,我用一个二维数组存储矩阵中的数据,矩阵详细定义如下 class Matrix { public: Matrix(int rows, int cols) { _rows = rows ...

  6. CentOS使用465端口发送邮件

    1)邮件发送示例 方法1:echo "This is a test mail" | mail -s '邮件测试' 452666750@qq.com 方法2:mail -s '服务运 ...

  7. step1:准备歌词之《前端开发是个啥》

    以下是给大家介绍前端开发的填词,曲子是李圣杰的<最近>,大家喜欢可以试试唱. 点赞关注超过100的平台,我后续上来发本人原唱视频(目前正在练习中...),另外大家觉得哪些词写得不好的,欢迎 ...

  8. javascript 集合 Object Array Map Set

    //Object //创建 var obj = {} function obj(){} class obj{} //Array api Array属性和方法: for 条件判断: break cont ...

  9. php 安装扩展插件实例-gd库

    今天给php 安装一个扩展插件 gd库   一.gd库是什么 gd库是一个开源的图像处理库,它通过提供一系列用来处理图片的API,使其可以用来创建图表.图形.缩略图以及其他图像的处理操作. gd库支持 ...

  10. 斯坦福大学cs231n作业参考(中文版)

    cs231n2016冬季课程作业完成,在原先的基础上进行了翻译和中文注释,同时增加了16之后版本的部分新作业文件,已经全部跑通,需要的欢迎自取. 斯坦福大学的 CS231n(全称:面向视觉识别的卷积神 ...