zoukankan      html  css  js  c++  java
  • BZOJ 2054 疯狂的馒头

    Description

    n个点,m次操作,每次把(i*p+q)%n+1与(i*q+p)%n+1之间的点染上颜色i,被染过色的会被新颜色覆盖,求最后每个点的颜色。

    【题解】

    因为被染过的颜色会被新的颜色覆盖,所以对于一个点,有效的染色只是最后一次。

    那么我们可以倒着染色,已经染色的不染

    求每个点被哪种区间覆盖或者某个区间是否已经被覆盖过都可以用并查集做。

    我们把每个染过色的点都指向染色区间的右端点+1的位置,那么下一个没被染色的点就是find(x)

    如果一个区间[l,r]满足find(l)>=r+1,那么这个区间已经被染色

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=1000010;
    int n,m,p,q,col[maxn],fa[maxn];
    void read(int &k){
    	k=0; int f=1; char c=getchar();
    	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    	while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
    	k*=f;
    } 
    int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    int main(){
    	read(n); read(m); read(p); read(q); 
    	for (int i=1;i<=n+1;i++) fa[i]=i;
    	for (int i=m;i>=1;i--){
    		int l=(1LL*i*p+q)%n+1,r=(1LL*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]=find(j+1);
    		}
    	}
    	for (int i=1;i<=n;i++) printf("%d
    ",col[i]);
    	return 0;
    }
  • 相关阅读:
    学习笔记 MYSQL报错注入(count()、rand()、group by)
    学习笔记 HTTP参数污染注入
    学习笔记 MSSQL显错手工注入
    代码审计入门后审计技巧
    字符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
  • 原文地址:https://www.cnblogs.com/DriverLao/p/7780326.html
Copyright © 2011-2022 走看看