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;
	}
}
posted @ 2021-09-03 17:39  lei_yu  阅读(47)  评论(0编辑  收藏  举报