Manthan, Codefest 18 (rated, Div. 1 + Div. 2) E bfs + 离线处理
2024-10-01 11:30:01
https://codeforces.com/contest/1037/problem/E
题意
有n个人,m天,在第i天早上,x和y会成为朋友,每天晚上大家都要上车,假如一个人要上车那么他得有至少k个朋友上车,输出每天晚上上车人数
题解
- 一个点的度数<k,他就上不了车
- 假如一个人上不了车,那么他对他的朋友就没有了价值,就等于把边去掉
- 离线处理,反着消边
- 因为每条边只能走一次,所以标记边bfs
代码
#include<bits/stdc++.h>
#define MAXN 200005
#define mk make_pair
using namespace std;
int n,m,k,u[MAXN][2],in[MAXN],a[MAXN];
vector<int>G[MAXN];
queue<int>Q;
map<pair<int,int>,int>del;
int main(){
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
u[i][0]=x;u[i][1]=y;
in[x]++;in[y]++;
G[x].push_back(y);G[y].push_back(x);
}
int ans=n;
for(int i=1;i<=n;i++){
if(in[i]<k){ans--;Q.push(i);}
}
while(!Q.empty()){
int u=Q.front();Q.pop();
for(auto v:G[u]){
if(del[mk(u,v)]==1)continue;
del[mk(u,v)]=del[mk(v,u)]=1;
if(in[v]<k)continue;
in[v]--;
if(in[v]<k){ans--;Q.push(v);}
}
}
a[m]=ans;
for(int i=m;i>1&&ans>0;i--){
int x=u[i][0],y=u[i][1];
if(del[mk(x,y)]==1){a[i-1]=ans;continue;}
del[mk(x,y)]=del[mk(y,x)]=1;
in[x]--;in[y]--;
if(in[x]<k){ans--;Q.push(x);}
if(in[y]<k){ans--;Q.push(y);}
while(!Q.empty()){
int u=Q.front();Q.pop();
for(auto v:G[u]){
if(del[mk(u,v)]==1)continue;
del[mk(u,v)]=del[mk(v,u)]=1;
if(in[v]<k)continue;
in[v]--;
if(in[v]<k){ans--;Q.push(v);}
}
}
a[i-1]=ans;
}
for(int i=1;i<=m;i++)printf("%d\n",a[i]);
}
最新文章
- 解决tomcat启动Socket监听端口死循环被hold问题
- C读取文件
- 01---Net基础加强
- windows服务器记录3389远程桌面IP策略
- 行为识别(action recognition)相关资料
- Centos硬件信息查看命令
- Oralce9 的新方法: Merge into Using
- MATLAB中的结构数组
- matlab里textread出现错误“Trouble reading floating point number from file (row 1, field 1)”
- google ip地址
- Android开发技巧——高亮的用户操作指南
- &;&;和&;、||和|的区别
- Config Server高可用
- AIM Tech Round 5 (rated, Div. 1 + Div. 2) (A, B, E)
- 您的快递(高并发服务器之poll和epoll)请签收
- python flask 接口
- .Net C#向远程服务器Api上传文件
- jquery.fullpage 全屏滚动
- linux第一个C语言和sh脚本
- redis 类型、方法