求助,调的心态炸了
查看原帖
求助,调的心态炸了
218405
_CHO楼主2020/8/13 22:24

调了一晚上也没看错啥错误

4个点WA

求大佬帮忙康康

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e+5+100;
int n,m,cnt;
bool flag;
int a[maxn],f[maxn],h[maxn];
int p[maxn],q[maxn];
bool vis[maxn];
int he[maxn],G[maxn<<1],ne[maxn<<1],_cnt=1;
int c[2],t[maxn];
int val[maxn];
void add_Edge(int u,int v){
	G[_cnt] = v;
	ne[_cnt] = he[u];
	he[u] = _cnt++;
}
void init(){
	cnt=0;_cnt=1;flag=true;
	memset(val,0,sizeof(val));
	memset(vis,false,sizeof(vis));
	memset(he,0,sizeof(he));
	memset(t,0x3f,sizeof(t));
	for(int i=1;i<=maxn;++i) f[i] = i,h[i] = 1;
}
int anc(int x){
	if(x==f[x]) return x;
	return f[x]=anc(f[x]);
}
void merge(int x,int y){
	f[anc(x)] = anc(y);
}
bool dfs(int u,int o){
	vis[u] = true;
	t[u] = o;
	c[o] += val[u];
	for(int i=he[u];i;i=ne[i]){
		int v=G[i];
		if(t[u]==t[v]) return false;
		if(vis[v]) continue;
		if(!dfs(v,o^1))return false;
	}
	return true;
}
signed main(){
	freopen("618517.in","r",stdin);
	//freopen("ddd.out","w",stdout);
	int T;scanf("%lld",&T);
	while(T--){
		init();
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<=n;++i)scanf("%lld",a+i);
		for(int i=1;i<=n;++i){
			int x;scanf("%lld",&x);
			a[i]-=x;
		}
		for(int i=1;i<=m;++i){
			int opt,u,v;scanf("%lld%lld%lld",&opt,&u,&v);
			if(opt==1){
				p[++cnt] = u;q[cnt] = v;
			}else{
				merge(u,v);
			}
		}
		for(int i=1;i<=n;++i){
			val[anc(i)] += a[i];
		}
		//for(int i=1;i<=n;++i) printf("%d   ",anc(i));
		for(int i=1;i<=cnt;++i){
			int u=anc(p[i]),v=anc(q[i]);
			add_Edge(u,v);
			add_Edge(v,u);
		}
		for(int i=1;i<=n;++i){
			//printf("%d %d\n",i,anc(i));
			if(t[i]!=0x3f3f3f3f3f3f3f3f||anc(i)!=i) continue;
			//printf("myc %d\n",i);
			c[0] = c[1] = 0;
			bool pd=dfs(i,0);
			if(pd&&(c[0]!=c[1])) flag=false;
			if(!pd && (((c[0]^c[1])&1ll))) flag=false;
			//printf("ccf %d\n",cnt);
		}
		printf("%s\n",flag?"YES":"NO");
	}
	return 0;
}
2020/8/13 22:24
加载中...