[luogu P2391] 白雪皑皑

题目背景

“柴门闻犬吠,风雪夜归人”,冬天,不期而至。千里冰封,万里雪飘。空中刮起了鸭毛大雪。雪花纷纷,降落人间。 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼。但是 pty 却不高兴,他不喜欢白色的世界,他觉得这样太单调了。所以他想对雪花进行染色,让世界变得多彩些。

题目描述

现在有 N 片雪花排成一列。 Pty 要对雪花进行 M 次染色操作,第 i次染色操作中,把第(i*p+q)%N+1 片雪花和第(i*q+p)%N+1 片雪花之间的雪花(包括端点)染成颜色 i。其中 p,q 是给定的两个正整数。他想知道最后 N 片雪花被染成了什么颜色。

输入输出格式

输入格式:

包含 4 行:

N M p q 意义如题中所述。

输出格式:

包含 N 行:

第 i 行表示第 i 片雪花被染成的颜色 c

输入输出样例

输入样例#1: 复制

4
3
2
4
输出样例#1: 复制

2
2
3
0

说明

20%的数据满足:1<=n,m<=1000

40%的数据满足:1<=n<=8000,1<=m<=1000000

80%的数据满足:1<=n<=500000,1<=m<=10000000

100%的数据满足:1<=n<=1000000,1<=m<=10000000

保证 1<=M*p+q,M*q+p<=2*10^9

脑子都不好使了。。。并查集都用不来了。

对于这一题,我们可以把原问题转为做m次修改。

每一次修改,在一个区间内,把没有修改过的位置染上色(即修改)。

然后,最后输出每一个位置分别是哪一种颜色(即哪次修改,也可能为0,表示没有修改)。

妙用并查集,有点链表的味道,用fa[i]表示1~i里面,离i最近的没有被修改过的位置。

然后,对于一次修改,把当前位置修改好了就修改fa[i],一直到修改好为止(或是修改到0)。

由于每个位置最多被修改1次,所以复杂度是O(n)的。最多乘上一个并查集常数。

有个地方还需要探讨一下——就是路径压缩的问题。

对于这题,路径压缩之后有没有影响?

不存在的。我们可以吧点于点的关系看做是树,森林。

那么,事实上,只有根节点才没有被修改过,其他点都是已经修改过的,所以无论关系怎么变化,都不会有影响。

当然,运用并查集就是为了增快查询速度,而且路径压缩是关键。

注意,在更新fa[i]时,直接取i-1或fa[i-1]或get(i-1)就好,因为i这个位置被访问到当且仅当它第一次被更新到。

那么这样,根据定义,fa[i]就是get(i-1)了。

code:

 #pragma GCC optimize(2)
 #include<cstdio>
 #include<cstring>
 #include<algorithm>
 typedef long long LL;
 namespace fastIO {
     inline int read() {
         ,f=; char ch=getchar();
         ') {
             if (ch=='-') f=-f;
             ch=getchar();
         }
         ') {
             x=(x<<)+(x<<)+ch-';
             ch=getchar();
         }
         return x*f;
     }
     ];
     inline void write(int x) {
         ) {
             putchar(');
             return;
         }
         ) {
             x=-x;
             putchar('-');
         }
         ; x; x/=) w[++cnt]=x%;
         );
     }
     inline void newline() {
         putchar('\n');
     }
 }
 namespace OJ{
     void Online_Judge() {
         #ifndef ONLINE_JUDGE
             freopen("in.txt","r",stdin);
             freopen("out.txt","w",stdout);
         #endif
     }
 }
 ;
 int n,m,p,q,fa[N],cov[N];
 inline int get(int x) {
     return fa[x]==x?x:fa[x]=get(fa[x]);
 }
 int main() {
     OJ::Online_Judge();
     using namespace fastIO;
     n=read(),m=read(),p=read(),q=read();
     ; i<=n; ++i) {
         cov[i]=;
         fa[i]=i;
     }
     int l,r;
     for (int i=m; i; --i) {
         l=(i*p+q)%n+,r=(i*q+p)%n+;
         if (l>r) std::swap(l,r);
         for (r=get(r); l<=r; r=get(r)) {
             cov[r]=i;
             fa[r]=r-;
         }
     }
     ; i<=n; ++i) {
         write(cov[i]);
         newline();
     }
     ;
 }

[luogu P2391] 白雪皑皑的更多相关文章

  1. Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集

    4月的时候在luogu上做过 白雪皑皑 这道题,当时一遍AC可高兴了qwq,后来去了个厕所,路上忽然发现自己的做法是错的qwq...然后就咕咕了qwq 今天看到了 疯狂的馒头 ,发现一毛一样OvO.. ...

  2. 洛谷P2391 白雪皑皑(并查集)

    题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...

  3. 洛谷 P2391 白雪皑皑 线段树+优化

    题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...

  4. 洛谷 P2391.白雪皑皑 (并查集,思维)

    题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后 ...

  5. 题解 SP2713 【GSS4 - Can you answer these queries IV】

    用计算器算一算,就可以发现\(10^{18}\)的数,被开方\(6\)次后就变为了\(1\). 所以我们可以直接暴力的进行区间修改,若这个数已经到达\(1\),则以后就不再修改(因为\(1\)开方后还 ...

  6. 题解 CF920F 【SUM and REPLACE】

    可以事先打表观察每个数的约数个数,观察到如果进行替换,若干次后这个数便会被替换成1. 所以我们可以直接暴力的进行区间修改,若这个数已经到达1或2,则以后就不再修改,用并查集和树状数组进行维护. 这个方 ...

  7. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  8. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  9. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

随机推荐

  1. pytorch使用不完全文档

    1. 利用tensorboard看loss: tensorflow和pytorch环境是好的的话,链接中的logger.py拉到自己的工程里,train.py里添加相应代码,直接能用. 关于环境,小小 ...

  2. JavaScript 常用内置对象(字符串属性、Math对象、Array数组对象)

    1.字符串属性   <script>   var test_var = "I Iove you"; console.log(test_var.charAt(3)) // ...

  3. polyfillJS生成promise对象

    https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js

  4. liunx驱动----点亮LED

    自动挂接根文件系统(直接从NFS启动) 修改uboot命令行 把 bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 ...

  5. css中height 100vh的应用场景,动态高度百分比布局,浏览器视区大小单位

    css中height 100vh的应用场景,动态高度百分比布局,浏览器视区大小单位 height:100vh 一些只能vw, vh才能完成的应用场景: 1. 场景之:元素的尺寸限制 vw vh 主要是 ...

  6. Redis的数据结构、通用操作及其特性

    Redis的数据结构 五种数据类型: 字符串(String).字符串列表(list).字符串集合(set).有序字符串集合(sorted set).哈希(hash) key定义的注意点: 不要过长,不 ...

  7. MySQL ERROR 1698 (28000): Access denied for user 'root'@'localhost'

    今天在安装MySQL的过程中竟然没有让我输入密码,登录的时候也不需要密码就能进入,这让我很困惑. 进了数据库就设置密码,用了各种方式都不行. 虽然我这数据库没啥东西但也不能没有密码就裸奔啊,有点丢人是 ...

  8. Java反射操作成员变量 Class can not access a member with modifiers "*"

    fields[j].set(obj, val); 报: Exception in thread "main" java.lang.IllegalAccessException: C ...

  9. 解决 Invalid character found in method name. HTTP method names must be tokens 异常信息

    一个线上环境出现异常,不是spring boot. 解决方法: server.xml中加上maxHttpHeaderSize="8192" springBoot 1.x则是在app ...

  10. 利用Java手写简单的httpserver

    前言: 在看完尚学堂JAVA300中讲解如何实现一个最简单的httpserver部分的视频之后, 一.前置知识 1.HTTP协议 当前互联网网页访问主要采用了B/S的模式,既一个浏览器,一个服务器,浏 ...