• 【BZOJ】2054: 疯狂的馒头


    【题意】给定n个元素,m次给一段区间染色为i,求最终颜色。

    【算法】并查集

    【题解】因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点。

    细节:

    1.fa[n+1]=n+1!!!界外点要赋值为自身!!!

    2.swap(l,r),涉及双端点的题都要注意。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=1000010;
    int n,m,p,q,fa[maxn],col[maxn];
    int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    int main(){
        scanf("%d%d%d%d",&n,&m,&p,&q);
        for(int i=1;i<=n+1;i++)fa[i]=i;// 
        int num=0;
        for(int i=m;i>=1;i--){
            int l=(i*p+q)%n+1,r=(i*q+p)%n+1;
            if(l>r)swap(l,r);//
            for(int j=find(l);j<=r;j=find(j)){
                col[j]=i;fa[j]=j+1;num++;
            }
            if(num==n)break;
        }
        for(int i=1;i<=n;i++)printf("%d
    ",col[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    宜未雨而绸缪,毋临渴而掘井。
    JDBC fetch size
    社会主义核心价值观
    JavaEE
    《夜泊牛渚怀古》
    JAVA "GMT+10" 和 "GMT+0010"
    乡村振兴1
    申论 题好文一半
    UCOS时钟与中断:
    任务的状态-挂起和恢复
  • 原文地址:https://www.cnblogs.com/onioncyc/p/7647829.html
Copyright © 2020-2023  润新知