zoukankan      html  css  js  c++  java
  • [bzoj2054] 疯狂的馒头

    Description

    Input

    第一行四个正整数N,M,p,q

    Output

    一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0)。

    Sample Input

    4 3 2 4
    

    Sample Output

    2
    2
    3
    0
    

    Hint

    题解

    本题要求求最后的颜色,我们很容易就可以想到暴力,即顺序染色,每一次覆盖一段区间,但是毫无疑问,对于本题的大数据必然超时。超时的关键在于我们每次都重复染色一个区间的每一个馒头,所以我们用并查集来优化,倒序染色,用(f[i])来记录(i)的父节点,即i后面的第一个没有被染色的馒头的位置,每次染色直接指向每有被染色的馒头位置,这样我们就避免了不必要的染色,从而效率大幅度提高。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    const int N=1000001;
    int f[N],c[N];
    
    int find(int x)
    {
    	if(!f[x]) return x;
    	return f[x]=find(f[x]);
    }
    
    int main()
    {
    	int n,m,p,q,l,r,tmp;
    	scanf("%d%d%d%d",&n,&m,&p,&q);
    	for(int i=m;i;--i)
    	{
    		l=(i*p+q)%n+1,r=(i*q+p)%n+1;
    		if(l>r) tmp=l,l=r,r=tmp;//注意此处需要交换
    		for(int j=find(l);j<=r;j=find(j))
    			c[j]=i,f[j]=j+1;//相当于链式存储
    	}
    	for(int i=1;i<=n;++i) printf("%d
    ",c[i]);
    	return 0;
    }
    

    本文作者:OItby @ https://www.cnblogs.com/hihocoder/

    未经允许,请勿转载。

  • 相关阅读:
    "less is more",用"less”命令查看linux文本文件
    Linux命令"ls"进阶说明
    Linux文件权限说明
    Ubuntu14.04安装Ruby2.2方法
    Ubuntu查找软件命令
    Using If/Truth Statements with pandas
    Categorical Data
    DataFrame.loc的区间
    pandas学习(一)
    JDBC编程之事务处理
  • 原文地址:https://www.cnblogs.com/hihocoder/p/11380966.html
Copyright © 2011-2022 走看看