求助!为什么不能用并查集维护往后第一个可染色的点
查看原帖
求助!为什么不能用并查集维护往后第一个可染色的点
1070708
Caged_Bird楼主2024/11/5 13:42

RT,代码如下

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void print(int n){if(n<0){putchar('-');print(-n);return;}if(n>9)print(n/10);putchar(n%10+'0');}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
int n,m,p,q,fa[1000005],color[1000005];
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
signed main(){
    cin>>n>>m>>p>>q;
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=m;i>=1;i--){
        int l=(i*q+p)%n+1,r=(i*p+q)%n+1;
        if(r<l)swap(l,r);
        for(int j=l;j<=r;){
            if(find(j)==j){
                color[j]=i;
                fa[j]=find(j+1);
            }
            j=find(j);
        }
    }
    for(int i=1;i<=n;i++)cout<<color[i]<<endl;
    return 0;
}//TLE15pts

通过代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void print(int n){if(n<0){putchar('-');print(-n);return;}if(n>9)print(n/10);putchar(n%10+'0');}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
int n,m,p,q,fa[1000005],color[1000005];
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
signed main(){
    cin>>n>>m>>p>>q;
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=m;i>=1;i--){
        int l=(i*q+p)%n+1,r=(i*p+q)%n+1;
        if(r<l)swap(l,r);
        for(int j=r;j>=l;){
            if(find(j)==j){
                color[j]=i;
                fa[j]=find(j-1);
            }
            j=fa[j];
        }
    }
    for(int i=1;i<=n;i++)cout<<color[i]<<endl;
    return 0;
}
2024/11/5 13:42
加载中...