提交时间:2025-06-12 14:52:10

运行 ID: 38058

#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=20010,N=35; int n,m; struct node{ int op,i,j,l,r; }q[MAXN]; struct solve0{ int ans,a[MAXN],siz[MAXN],fa[MAXN]; int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} void mrge(int x,int y){x=fid(x),y=fid(y),siz[y]+=siz[x],fa[x]=y;} void dfs(int now){ if(now==n+1){ for(int i=1;i<=n;i++)siz[i]=a[i],fa[i]=i; for(int i=1;i<=m;i++){ if(q[i].op==1)mrge(q[i].i,q[i].j); if(q[i].op==2)siz[fid(q[i].i)]-=a[q[i].i]; if(q[i].op==3){ if(siz[fid(q[i].i)]<q[i].l||siz[fid(q[i].i)]>q[i].r)return; } } ans=1; return; } a[now]=1; dfs(now+1); if(ans)return; a[now]=0; dfs(now+1); } void slv0(){ dfs(1); if(!ans)puts("NO"); else{ puts("YES"); for(int i=1;i<=n;i++)putchar(a[i]?'R':'B'); } } }S0; struct solve1{ int fa[MAXN],l[MAXN],r[MAXN],a[MAXN]; stack<pair<pii,pii> >st; int fid(int x){return x==fa[x]?x:fa[x]=fid(fa[x]);} void mrge(int x,int y){ x=fid(x),y=fid(y); if(x==y)return; fa[x]=y; st.push(mk(mk(x,y),mk(l[y],r[y]))); l[y]=l[x]+l[y],r[y]=r[x]+r[y]; } void chk(){ for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=m;i++){ int op=q[i].op,L=q[i].l,R=q[i].r,x=q[i].i,y=q[i].j; if(op==1)mrge(x,y); if(op==3){ x=fid(x); assert(l[x]>=L&&l[x]<=R); } } } void slv1(){ for(int i=1;i<=n;i++)fa[i]=i,l[i]=0,r[i]=1; for(int i=1;i<=m;i++){ int op=q[i].op,L=q[i].l,R=q[i].r,x=q[i].i,y=q[i].j; if(op==1)mrge(x,y); if(op==3){x=fid(x); l[x]=max(l[x],L),r[x]=min(r[x],R); if(l[x]>r[x]){ puts("NO"); return; } } } for(int i=1;i<=n;i++)if(fid(i)==i)r[i]=l[i]; while(!st.empty()){ int x=st.top().fr.fr,y=st.top().fr.sc,L=st.top().sc.fr,R=st.top().sc.sc;st.pop(); int tmp=l[y]-l[x]; if(tmp>R)l[x]+=tmp-R,tmp=R; r[x]=l[x]; l[y]=r[y]=tmp; } puts("YES"); for(int i=1;i<=n;i++){ putchar(l[i]?'R':'B'); } } }S1; void slv(){ n=read(),m=read(); for(int i=1;i<=m;i++){ q[i].op=read(); if(q[i].op==1)q[i].i=read(),q[i].j=read(); if(q[i].op==2)q[i].i=read(); if(q[i].op==3)q[i].i=read(),q[i].l=read(),q[i].r=read(); } if(n<=20)S0.slv0();else S1.slv1(); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); return 0; }