洛谷 P2391 白雪皑皑 线段树+优化
题目描述:
现在有 \(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
100%的数据满足:1<=n<=1000000,1<=m<=10000000
保证 \(1<=M*p+q\),\(M*q+p<=2*10^9\)
思路分析
第一眼看到这道题,这不就是线段树裸题吗?
再看一眼数据范围,发现过不去,我们可以看到所给的修改区间是特殊的
,然后就开始快乐的打表找规律,经过打表,我们发现,针对区间的修改
是多个最大长度为\(n\)的循环节,(~我也不会证~)然后区间修改就从1e7降
为了1e6,剩下的就是线段树模板了。
看了一下题解,大部分都是链表,并查集(~可我没想出来~)
就用线段树水了一发
本题的数据还是很水的(之前错误的暴力都能过,现在过不了了)
注意余数处理哟!
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1e6+100;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return ret*f;
}
int n,m,p,q;
struct node{
int clo;
int laz;
int l,r;
node(){
clo=0;
laz=0;
l,r=0;
}
}tre[maxn*4];
void build(int rt,int l,int r){
tre[rt].l=l;
tre[rt].r=r;
if(l==r){
return ;
}
int mid=(l+r)>>1;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
}
void pushdown(int rt){
if(tre[rt].laz){
tre[rt*2].clo=tre[rt].laz;
tre[rt*2+1].clo=tre[rt].laz;
tre[rt*2].laz=tre[rt].laz;
tre[rt*2+1].laz=tre[rt].laz;
tre[rt].laz=0;
}
return ;
}
void update(int rt,int l,int r,int ql,int qr,int k){
if(r<ql||l>qr){
return;
}
if(ql<=l&&qr>=r){
tre[rt].clo=k;
tre[rt].laz=k;
return;
}
int mid=(l+r)>>1;
pushdown(rt);
if(ql<=mid){
update(rt*2,l,mid,ql,qr,k);
}
if(qr>mid){
update(rt*2+1,mid+1,r,ql,qr,k);
}
return ;
}
void out(int rt,int l,int r){
if(l==r){
cout<<tre[rt].clo<<endl;
return;
}
int mid=(l+r)>>1;
pushdown(rt);
out(rt*2,l,mid);
out(rt*2+1,mid+1,r);
}
int main(){
// freopen("a.in","r",stdin);
n=read();
m=read();
p=read();
q=read();
int ll,rr;
int lr=1;
if(m>n){
lr=m-(m%n+n);
}
for(int i=lr;i<=m;i++){
ll=min((i*p+q)%n+1,(i*q+p)%n+1);
rr=max((i*p+q)%n+1,(i*q+p)%n+1);
update(1,1,n,ll,rr,i);
}
out(1,1,n);
return 0;
}
完结撒花!!
洛谷 P2391 白雪皑皑 线段树+优化的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- 【洛谷】【线段树】P1886 滑动窗口
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
- 【洛谷】【线段树】P3353 在你窗外闪耀的星星
[题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...
- 洛谷P5280 [ZJOI2019]线段树
https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...
- 洛谷 - P1198 - 最大数 - 线段树
https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
- 洛谷P3374(线段树)(询问区间和,支持单点修改)
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
随机推荐
- 用ThreadLocal来优化下代码吧
最近接手了一个老项目,看到一个很有意思的现象. 这个项目中大量的方法入参都会带上user信息,比如这样 它的意图是希望在方法内使用user的信息,但是如此大范围的传递用户信息,第一感觉就是不优雅.那有 ...
- 多线程之ReentrantLock篇(五)
昨天有说过后面讲ReentrantLock,今天我们这篇幅就全局的讲解下,我们在Lock出来前,解决并发问题没得选只能用Synchronized. 一.ReentrantLock PK synchro ...
- ESP8266 玩板记
一.前言 esp8266的玩板记,后面应该会去更一些其他东西,这一块内容,这算是收官之战了. IoT,江湖有缘再相会 二.ESP8266实现WiFi杀手/钓鱼 这次的博客做的是一个娱乐性较强的项目. ...
- 3.Android网络编程-http介绍
1.HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET(查), POST(改)和 HEAD(获取报头,一般用来测试链接是否正常)方法. ...
- 多测师讲解_python_pycharm基本实用操作__保存代码_
pycharm中中保存代码的方式: 方式一: 方式二: 第一步: 第二步:
- 【最短路】HDU 1688 Sightseeing
题目大意 给出一个有向图(可能存在重边),求从\(S\)到\(F\)最短路的条数,如果次短路的长度仅比最短路的长度多1,那么再加上次短路的条数. 输入格式 第一行是数据组数\(T\). 对于魅族数据, ...
- v-model数据绑定分析
v-model数据绑定分析 v-model是Vue提供的指令,其主要作用是可以实现在表单<input>.<textarea>及<select>等元素以及组件上创建双 ...
- linux(centos8):prometheus使用mtail监控错误日志
一,mtail的用途? mtail :从应用程序日志中提取指标以导出到时间序列数据库或时间序列计算器 它是一个google开发的日志提取工具,用途就是: 实时读取应用程序的日志. 再通过自己编写的脚本 ...
- centos8上安装mysql8
一,下载并解压mysql8 1,mysql官网 https://www.mysql.com/ 2,下载到source目录 [root@yjweb source]# wget https://cdn.m ...
- docker 启动容器restart 策略
docker 运行容器时使用--restart 参数可以指定一个restart策略,来指定容器应该如何重启,或不应该重启,当容器启用restart策略时,将会载docker ps 显示up 或者res ...