蒟蒻求助,学OI不止1s了
查看原帖
蒟蒻求助,学OI不止1s了
196899
lndjy楼主2020/4/27 08:45

RT,最后四个点WA。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
int inline read()
{
	int ans=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')
		f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		ans=ans*10+ch-'0';
		ch=getchar();
	}
	return ans*f;
}
struct edge
{
	int to,nxt;
}e[200005];
int head[100005];
int t[100005],u[100005],v[100005],a[100005],b[100005];
int s[100005],f[100005];
int col[100005];
int n,m;
int find(int k)
{
	if(f[k]==k) return k;
	return f[k]=find(f[k]);
}
int cnt;
void clear()
{
	for(int i=1;i<=100000;i++)
	f[i]=i;
	memset(e,0,sizeof e);
	memset(head,0,sizeof head);
	memset(col,0,sizeof col);
	memset(s,0,sizeof s);
	cnt=0;
}
void add(int from,int to)
{
	cnt++;
	e[cnt].to=to;
	e[cnt].nxt=head[from];
	head[from]=cnt;
}
int sum[2];
bool dfs(int now,int c)
{
	col[now]=c;
	sum[c-1]+=s[now];
	for(int i=head[now];i;i=e[i].nxt)
	{
		if(col[e[i].to]==c) return 0;
		if(col[e[i].to]==0&&!dfs(e[i].to,3-c)) return 0;
	}
	return 1;
}
void solve()
{
	n=read();m=read();
	for(int i=1;i<=n;i++)
	a[i]=read();
	for(int i=1;i<=n;i++)
	b[i]=read();
	for(int i=1;i<=m;i++)
	{
		t[i]=read();u[i]=read();v[i]=read();
	}
	for(int i=1;i<=m;i++)
	if(t[i]==2)
	f[find(u[i])]=find(v[i]);
	for(int i=1;i<=n;i++)
	s[find(i)]+=b[i]-a[i];
	for(int i=1;i<=m;i++)
	if(t[i]==1)
	{
		int x=find(u[i]),y=find(v[i]);
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++)
	{
		if(find(i)==i&&col[i]==0)
		{
			sum[0]=sum[1]=0;
			bool ok=dfs(i,1);
			if(ok&&sum[1]!=sum[0])
			{
				cout<<"NO"<<'\n';
				return;
			}
			if(!ok&&(sum[1]+sum[0])%2==1)
			{
				cout<<"NO"<<'\n';
				return;
			}
		}
	}
	cout<<"YES"<<'\n';
}
signed main()
{
	int T=read();
	while(T--) clear(),solve();
	return 0;
}
2020/4/27 08:45
加载中...