社区讨论
WA 80pts MnZn求助
P6185[NOI Online #1 提高组] 序列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lyxvsqtg
- 此快照首次捕获于
- 2024/07/23 11:53 2 年前
- 此快照最后确认于
- 2024/07/23 13:39 2 年前
C
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
#define int long long
int T,n,m,a[N],b[N],t[N],u[N],v[N],vis[N],fa[N],match[N],tot[N],tot2[N];
vector<int> G[N];
bool flag3=true;
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
fa[fx]=fy;
}
}
void dfs(int x,int f){
if(vis[x]==-1) vis[x]=!vis[f];
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(vis[y]==vis[x]){
flag3=false;
return;
}
else if(vis[y]!=vis[x]&&vis[y]!=-1) continue;
if(f!=0){
merge(f,y);
}
dfs(y,x);
}
}
bool dfs2(int x,int t){
if(vis[x]==t){
return false;
}
vis[x]=t;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(match[y]==0||dfs2(match[y],t)){
match[y]=x;
return true;
}
}
return false;
}
signed main(){
cin>>T;
while(T--){
cin>>n>>m;
int sum=0;
flag3=true;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
fa[i]=i;
vis[i]=-1;
G[i].clear();
match[i]=0;
tot[i]=0;
tot2[i]=0;
}
int tmp=0;
for(int i=1;i<=n;i++){
cin>>b[i];
tmp+=b[i];
}
for(int i=1;i<=m;i++){
cin>>t[i]>>u[i]>>v[i];
if(t[i]==2){
if(u[i]!=v[i]) merge(u[i],v[i]);
}
}
bool flag2=false;
for(int i=1;i<=m;i++){
if(t[i]==1){
int fx=find(u[i]),fy=find(v[i]);
if(fx!=fy){
G[fx].push_back(fy);
G[fy].push_back(fx);
}
else flag2=true;
}
}
for(int i=1;i<=n;i++){
if(vis[i]==-1){
dfs(i,0);
}
}
for(int i=1;i<=n;i++) vis[i]=0;
int cnt=0;
if(flag3){
for(int i=1;i<=n;i++){
if(fa[i]==i){
if(dfs2(i,i)){
++cnt;
}
}
}
}
bool flag=true;
if(cnt==0){
if(flag2&&(tmp%2==sum%2)){
cout<<"YES"<<endl;
}
else if(tmp==sum){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
else{
for(int i=1;i<=n;i++){
tot[fa[i]]+=a[i];
tot2[fa[i]]+=b[i];
}
for(int i=1;i<=n;i++){
if(fa[i]==i){
if(match[i]==0){
if(tot[i]!=tot2[i]){
flag=false;
break;
}
}
else{
if((tot[i]-tot2[i])!=(tot[match[i]]-tot2[match[i]])){
flag=false;
break;
}
}
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...