题解:考虑逆序处理询问,用一个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. 实验2: CDP命令操作

    基本命令 1.获设备的相邻信息:CDP CDP1.不管上层协议 能够获取的信息包括:1.设备名2.对应各协议的地址3.端口名4.角色特征5.平台 全局启用/关闭CDP:cdp run/no cdp r ...

  2. 关于java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)

    public byte[] getBytes(Charset charset) Encodes this String into a sequence of bytes using the given ...

  3. 遍历CSDN博客

    --http://blog.csdn.net/leixiaohua1020/article/list/14?viewmode=contents function saveData(data) loca ...

  4. python学习记录(九)

    0911--https://www.cnblogs.com/fnng/archive/2013/05/08/3066054.html 魔法方法.属性 准备工作 为了确保是新型类,应该把_metacla ...

  5. SpringBoot使用ELK日志收集ELASTIC (ELK) STACK

    1:资源 # 文档向导 # logstash https://www.elastic.co/guide/en/logstash/current/index.html #kibana https://w ...

  6. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  7. SPH液面重构过程中的问题

    使用粒子方法进行流体特效模拟需要进行液面重构,构造出流体的自由表面,液面重构方法也是一个独立的研究方向,针对其的研究已经有了很多成果,包括液面的平滑度.精度和并行效率等. 在这里,主要是记录一下我在液 ...

  8. HBASE手动触发major_compact

    1.定时执行脚本#!/bin/bash source /etc/profile sh ./hbase shell <<EOF major_compact 'table_name' EOF ...

  9. Linux ftp VSftp

    一.Linux FTP服务器分类: <1>wu-ftp <2>proftp=profession ftp <3>vsftp=very security ftp  本 ...

  10. lua 打印一个table的实现

    print("-------------Test-----------------") local tb = {} function printProperties(t, csp) ...