[题解] P6185 [NOI Online #1 提高组] 序列

P6185 【NOI Online #1 提高组】 序列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
#define LL long long
const int maxn = 2e5 + 10;
template < class T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while ('0' > c || c > '9') f |= c == '-', c = getchar();
    while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
    s = f ? -s : s;
}
int head[maxn],cnt=0,T,n,m;
struct edge{
	int to,nxt;
}e[maxn<<2];
inline void add(int u,int v){
	e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
inline void link(int u,int v){
	add(u,v);add(v,u);
}
LL sum[maxn];
int val[maxn],pos[maxn],tot=0;
void clear(){
	cnt=tot=0;
	memset(head,0,sizeof head);
	memset(pos,0,sizeof pos);
	memset(sum,0,sizeof sum);
}
void dfs(int u,int block){
	sum[pos[u]=block]+=val[u];
	for(int i=head[u];i;i=e[i].nxt){
		if(!pos[e[i].to])dfs(e[i].to,block);
	}
}
void solve(){
	clear();read(n);read(m);
	for(int i=1;i<=(n<<1);i++)read(val[i]);
	for(int i=1;i<=m;i++){
		int t,u,v;read(t);read(u);read(v);
		if(t==1) link(u,v+n),link(v,u+n);
		if(t==2) link(u,v),link(u+n,v+n);
	}
	for(int i=1;i<=n<<1;i++)if(!pos[i])dfs(i,++tot);
	int fl=1;
	for(int i=1;i<=n;i++){
		if(pos[i]!=pos[i+n])fl&= sum[pos[i]]==sum[pos[i+n]];
		else fl&= sum[pos[i]]%2==0;
	}
	puts(fl?"YES":"NO");
}
int main(){
	scanf("%d",&T);
	while(T--){
		solve();
	}
	return 0;
}
posted @ 2021-08-12 16:59  ¶凉笙  阅读(32)  评论(0编辑  收藏  举报