通过离线将操作建树,即可得到最终存在的操作。
然后逆着操作的顺序,倒着进行染色,对于每行维护一个并查集即可。
时间复杂度$O(n(n+m))$。
#includeconst int N=1010,M=100010;int n,m,i,j,x,C,X1,Y1,X2,Y2,f[M],cnt,pos[M],e[M][5],col[N][N];char ch;struct DSU{ int f[N]; void init(){for(int i=0;i<=n+1;i++)f[i]=i;} int F(int x){return f[x]==x?x:f[x]=F(f[x]);}}g[N];inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}int main(){ read(n),read(m),read(m); for(i=1;i<=m;i++){ while((ch=getchar())!='P'&&ch!='S'&&ch!='L'); if(ch=='P'){ f[i]=x;x=i; for(j=0;j<5;j++)read(e[i][j]); } if(ch=='S')pos[++cnt]=x; if(ch=='L')read(x),x=pos[x]; } for(i=0;i