博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2054 疯狂的馒头
阅读量:5029 次
发布时间:2019-06-12

本文共 951 字,大约阅读时间需要 3 分钟。

Description

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

【题解】

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

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

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

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

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

#include
#include
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\n",col[i]); return 0;}

 

转载于:https://www.cnblogs.com/DriverLao/p/7780326.html

你可能感兴趣的文章
域 搭建OU 组织单元
查看>>
npm常用命令
查看>>
南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询...
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
生成指定位数随机数的方法
查看>>
java的垃圾回收
查看>>
Essential C++学习笔记
查看>>
python+selenium进行简单验证码获取
查看>>
where,having与 group by连用的区别
查看>>
【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
查看>>
Oracle T4-2 使用ILOM CLI升级Firmware
查看>>
4.14上午
查看>>
数据分析 -- 白话一下什么是决策树模型(转载)
查看>>
Java SPI机制原理和使用场景
查看>>
web前端java script学习2017.7.18
查看>>
删除TXPlatform
查看>>
LaTex:图片排版
查看>>
并发访问超时的问题可能性(引用)
查看>>
中小团队基于Docker的Devops实践
查看>>