题目描述:

现在有 \(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 白雪皑皑 线段树+优化的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. 【洛谷】【线段树】P1471 方差

    [题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...

  3. 【洛谷】【线段树】P1047 校门外的树

    [题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...

  4. 【洛谷】【线段树】P1886 滑动窗口

    [题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...

  5. 【洛谷】【线段树】P3353 在你窗外闪耀的星星

    [题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...

  6. 洛谷P5280 [ZJOI2019]线段树

      https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...

  7. 洛谷 - P1198 - 最大数 - 线段树

    https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...

  8. 洛谷P3374(线段树)(询问区间和,支持单点修改)

    洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...

  9. 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)

    题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...

随机推荐

  1. Python-读写csv数据模块 csv

    案例: 通过股票网站,我们获取了中国股市数据集,它以csv数据格式存储 Data,Open,High,Low,Close,Volume,Adj Close 2016-06-28,8.63,8.47,8 ...

  2. 怎么摆脱又臭又长的 Git 命令?

    在使用 Git 的时候,虽然大部分时候我们用的是图形客户端,但图形客户端不能解决所有的操作,所以,也少不了要需要使用命令行的时候. 但有些 Git 命令和参数确实又不好记,甚至有的命令每次要用的时候需 ...

  3. Linux安装软件方法总结

    相比于windows系统,Linux安装程序就比较复杂了,很多需要root用户才能安装.常见的有以下几种安装方法 源码安装 rpm包安装 yum安装 (RedHat.CentOS) apt-get安装 ...

  4. 剑指Offer(一):二维数组中的查找

    一.前言 刷题平台:牛客网 二.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...

  5. 头文件afx.h作用

    转载:https://blog.csdn.net/OnceMonkeyG/article/details/95723290 一些定义与设置,为MFC提供最基本支持,将各种松散的东西组织起来,同时为MF ...

  6. 3-kubernetes监控与日志管理

    监控集群资源利用率 metrics-server是一个集群范围的资源使用情况的数据聚合器,作为一个应用部署在集群中 metrics-server从每个节点上kubelet API收集指标,通过kube ...

  7. SHOI 2014 【概率充电器】

    加油,两道了,也就还剩那么二十来道吧,慢慢做...... 题目大意: 给你一颗树,树上的每一个节点都有一定的概率p[i]能冲上电,有电的点,可以通过树上的边,一定概率地将电传递到与它相邻的点,同时对于 ...

  8. 实现Excel文件的上传和解析

    前言 本文思维导图 一.需求描述 实现一个页面上传excel的功能,并对excel中的内容做解析,最后存储在数据库中. 二.代码实现 需求实现思路: 先对上传的文件做校验和解析,这里我们通过Excel ...

  9. [转载]volitale关键字详解

    来看这个代码: int fun(int& a) { int b = a; int c = a; return a+b+c; } int main() { int a=1; //........ ...

  10. ES6之数组

    数组新增方法 map(可以理解为是映射,以一定规则修改数组每一项并返回全新数组) reduce(可以理解为是汇总,一堆出来一个) filter(可以理解为过滤,筛选的意思,以一定规则拿到符合的项并返回 ...