3284 疯狂的黄大神
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3284 疯狂的黄大神相关的知识,希望对你有一定的参考价值。
黄大神十分喜欢吃馒头。兴奋之下他一下子买了N 个馒头请所有认识他的人吃。
但是黄大神不喜欢白色,喜欢红色、黄色、绿色等鲜艳的颜色。于是他把所有白色的馒头排成一列。然后进行M 次染色操作。每个染色操作都是用一个神奇的刷子把连续的多个馒头染成特定的某种颜色。一个馒头最终的颜色是最后一次染它的
颜色。如果一个馒头没有被染过色,那么它的颜色就是白色。现在CQF已经定好了染色计划:在第i次染色操作中,把第(i × p + q)mod N + 1个馒头和第(i × q + p)mod N + 1个馒头之间的馒头染成颜色i,其中p, q是特定的两个正整数。他想立即知道最后每个馒头的颜色。你能帮他吗?
第一行四个正整数N ,M ,p,q。
一共输出N 行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0)。
4 3 2 4
2
2
3
0
在20%的数据中,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000
在40%的数据中,1 ≤ N ≤ 10000,1 ≤ M ≤ 100000
在60%的数据中,1 ≤ N ≤ 50000,1 ≤ M ≤ 500000
在80%的数据中,1 ≤ N ≤ 300000,1 ≤ M ≤ 3000000
在100%的数据中,1 ≤ N ≤ 1000000,1 ≤ M ≤ 10000000
保证所以输入数据中1 ≤ M ∗ p + q, M ∗ q + p ≤ 231 − 1。
真tmd并查集水题
代码:
#include<cstdio> #include<iostream> using namespace std; #define N 10000010 typedef long long ll; int fa[N],ans[N]; ll n,m,p,q; int find(int x){ //return fa[x]==x?x:fa[x]=find(fa[x]);//坑 int r=x,pre; while(r!=fa[r]) r=fa[r]; while(x!=r){ pre=fa[x];fa[x]=r;x=pre; } return r; } int main() { //cin>>n>>m>>p>>q; scanf("%lld%lld%lld%lld",&n,&m,&p,&q); for(int i=1;i<=n+2;i++) fa[i]=i; for(int i=m;i>=1;i--){ ll l=((ll)i*p+q)%n+1; ll r=((ll)i*q+p)%n+1; if(l>r) swap(l,r); for(int j=find(l);j<=r;j=find(j)){ ans[j]=i;fa[j]=j+1; } } for(int i=1;i<=n;i++){ //cout<<ans[i]<<endl; printf("%d\n",ans[i]); } return 0; }
以上是关于3284 疯狂的黄大神的主要内容,如果未能解决你的问题,请参考以下文章