CF1548A Web of Lies
思考的突破口是最大的那个人连着的所有人都会死
进而我们可以想到一个人如果连着比他大的人那他就biss,因为比他大的人一定在他之后死,这条边就一直存在。
需要统计连着的比他大的人的数量,否则复杂度爆炸
#include<bits/stdc++.h>
using namespace std;
#define orz cout<<"lyakioi!!!!!!!!!!!!!!!!!"<<endl
inline int r(){int s=0,k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){s=s*10+c-'0';c=getchar();}return s*k;}
int n,q,m,head[1000001],cnt,ans,t[1000001];
struct node
{
int to,next;
}a[1000001];
void add_edge(int from,int to)
{
a[++cnt].to=to;
a[cnt].next=head[from];
head[from]=cnt;
}
int main()
{
int x,y,opt;
n=r();m=r();
for(int i=1;i<=m;i++)
{
x=r();y=r();
add_edge(x,y);
add_edge(y,x);
}
for(int u=1;u<=n;u++)
{
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
if(v>u)t[u]++;
}
if(t[u])ans++;
}
q=r();
for(int i=1;i<=q;i++)
{
opt=r();
if(opt==1)
{
x=r();y=r();
t[min(x,y)]++;
if(t[min(x,y)]==1)ans++;
}
if(opt==2)
{
x=r();y=r();
t[min(x,y)]--;
if(t[min(x,y)]==0)ans--;
}
if(opt==3)cout<<n-ans<<endl;
}
}
本文来自博客园,作者:lei_yu,转载请注明原文链接:https://www.cnblogs.com/lytql/p/15224129.html