50pts 求调
查看原帖
50pts 求调
927580
zhangxiandong091228楼主2024/11/12 17:21

rt

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int NR=1e5+5;
int T,n,x,y,m,t,eid,u[NR],v[NR],fa[NR],hd[NR],nxt[NR],to[NR],cnt;
ll a[NR],b[NR];
bool flag;
void connect(int u,int v)
{
	to[eid]=v;
	nxt[eid]=hd[u];
	hd[u]=eid++;
}
int findfa(int u)
{
    return fa[u]==u?u:fa[u]=findfa(fa[u]);
}
void add(int u,int v)
{
	u=findfa(u),v=findfa(v);
	if(u!=v)
    {
		fa[v]=u;
		a[u]+=a[v];
		b[u]+=b[v];
	}
}
void csh()
{
    memset(u,0,sizeof(u));
    memset(v,0,sizeof(v));
    memset(fa,0,sizeof(fa));
    memset(hd,0,sizeof(hd));
    memset(nxt,0,sizeof(nxt));
    memset(to,0,sizeof(to));
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    eid=1,cnt=1;
}
void read()
{
    csh();
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        fa[i]=i,hd[i]=0;
    }
    for(int i=1;i<=n;i++)
        cin>>b[i];
    for(int i=1;i<=m;i++)
    {
        cin>>t>>u[cnt]>>v[cnt];
        if(t==2)
        {
            add(u[cnt],v[cnt]);
            cnt--;
        }
    }
}
void solve()
{
    read();
    for(int i=1;i<=cnt;i++)
    {
        x=findfa(u[i]),y=findfa(v[i]);
        connect(x,y);
        connect(y,x);
    }
    for(int i=1;i<=n;i++)
    {
        x=findfa(to[hd[i]]);
        for(int e=nxt[hd[i]];e;e=nxt[e])
            add(x,findfa(to[e]));
    }
    for(int i=1;flag&&i<=n;i++)
    {
        if(hd[i])
        {
            x=findfa(i),y=findfa(to[hd[i]]);
            if(x==y)
                flag=((a[x]-b[x])!=1);
            else
                flag=((a[x]-b[x])==(a[y]-b[y]));
        }
        else
        {
            if(fa[i]==i)
                flag=(a[i]==b[i]);
        }
    }
}
int main()
{
	cin>>T;
	while(T--)
    {
        flag=true;
		solve();
		if(flag)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
	}
	return 0;
}

只过了前10个点

恳求大佬帮条一下(

%%%

2024/11/12 17:21
加载中...