AC日记——【模板】线段树 2 洛谷 P3373
P3373 【模板】线段树 2
387
通过
1.8K
提交
标签
难度 提高+/省选-
提交 讨论 题解
最新讨论 更多讨论
2333
最后三个点卡常数。
迷之RE
感觉这题很迷啊
好像一共三组测试数据。
友情提示:开long long
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.将某区间每一个数乘上x
3.求出某区间每一个数的和
输入输出格式
输入格式:
第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k
操作2: 格式:2 x y k 含义:将区间[x,y]内每个数加上k
操作3: 格式:3 x y 含义:输出区间[x,y]内每个数的和对P取模所得的结果
输出格式:
输出包含若干行整数,即为所有操作3的结果。
输入输出样例
输入样例#1:
5 5 38
1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
输出样例#1:
17
2
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=1000,M<=10000
对于100%的数据:N<=100000,M<=100000
(数据已经过加强^_^)
样例说明:
故输出应为17、2(40 mod 38=2)
思路:
裸线段树;
来,上代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> #define maxn 100005
#define LL long long using namespace std; struct TreeNodeType {
LL l,r,dis,mid,flag,flag_; bool if_;
};
struct TreeNodeType tree[maxn<<],*lc,*rc; LL if_z,n,m,type,x,p,ans; char Cget; inline void in(LL &now)
{
now=,if_z=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} void tree_build(LL now,LL l,LL r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
in(tree[now].dis);
return ;
}
tree[now].mid=(l+r)>>;
tree_build(now<<,l,tree[now].mid);
tree_build(now<<|,tree[now].mid+,r);
tree[now].dis=(tree[now<<].dis+tree[now<<|].dis)%p;
} void tree_do(LL now,LL l,LL r)
{
if(tree[now].l==l&&tree[now].r==r)
{
if(type==)
{
tree[now].dis=(tree[now].dis*x)%p;
tree[now].flag=(tree[now].flag*x)%p;
if(tree[now].if_) tree[now].flag_=(tree[now].flag_*x)%p;
else
{
tree[now].if_=true;
tree[now].flag_=x;
}
}
else if(type==)
{
tree[now].flag=(tree[now].flag+x)%p;
tree[now].dis=(tree[now].dis+((r-l+)*x)%p)%p;
}
else ans=(ans+tree[now].dis)%p;
return ;
}
if(tree[now].flag||tree[now].if_)
{
lc=&tree[now<<],rc=&tree[now<<|];
if(tree[now].if_)
{
lc->dis=(lc->dis*tree[now].flag_)%p;
rc->dis=(rc->dis*tree[now].flag_)%p;
lc->flag=(lc->flag*tree[now].flag_)%p;
rc->flag=(rc->flag*tree[now].flag_)%p;
if(lc->if_) lc->flag_=(lc->flag_*tree[now].flag_)%p;
else lc->flag_=tree[now].flag_,lc->if_=true;
if(rc->if_) rc->flag_=(rc->flag_*tree[now].flag_)%p;
else rc->flag_=tree[now].flag_,rc->if_=true;
tree[now].if_=false;
}
if(tree[now].flag)
{
lc->flag=(lc->flag+tree[now].flag)%p;
rc->flag=(rc->flag+tree[now].flag)%p;
lc->dis=(lc->dis+((lc->r-lc->l+)%p)*tree[now].flag)%p;
rc->dis=(rc->dis+((rc->r-rc->l+)%p)*tree[now].flag)%p;
tree[now].flag=;
}
}
if(l>tree[now].mid) tree_do(now<<|,l,r);
else if(r<=tree[now].mid) tree_do(now<<,l,r);
else
{
tree_do(now<<,l,tree[now].mid);
tree_do(now<<|,tree[now].mid+,r);
}
tree[now].dis=(tree[now<<].dis+tree[now<<|].dis)%p;
} int main()
{
in(n),in(m),in(p);LL l,r;
tree_build(,,n);
while(m--)
{
in(type),in(l),in(r);
if(type==||type==) in(x),tree_do(,l,r);
else
{
ans=;
tree_do(,l,r);
printf("%lld\n",ans);
}
}
return ;
}
AC日记——【模板】线段树 2 洛谷 P3373的更多相关文章
- AC日记——【模板】线段树 1 洛谷 P3372
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...
- 【线段树】洛谷 P3372 【模板】线段树 1
动态开结点线段树板子. #include<cstdio> using namespace std; typedef long long ll; ll sumv[400005],delta[ ...
- AC日记——红色的幻想乡 洛谷 P3801
红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #de ...
- P3372 【模板】线段树 1 洛谷
https://www.luogu.org/problem/show?pid=3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 ...
- 线段树【洛谷P2894】 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...
- AC日记——无线网络发射器选址 洛谷 P2038
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
- AC日记——小A的糖果 洛谷七月月赛
小A的糖果 思路: for循环贪心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defi ...
- AC日记——矩阵取数游戏 洛谷 P1005
矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struc ...
- AC日记——妖梦拼木棒 洛谷 P3799
妖梦拼木棒 思路: 神特么题: 代码: #include <bits/stdc++.h> using namespace std; #define mod 1000000007LL int ...
随机推荐
- tomcat关闭钩子
转 http://501565246-qq-com.iteye.com/blog/1733575 21,tomcat关闭钩子 博客分类: tomcat 在很多环境下,在关闭应用程序的时候需要做一些 ...
- Ubuntu下搭建多用户多权限ftp
#1.切换root用户模式 (已在root模式下的请忽略) sudo -i #然后提示你输入当前用户密码,输入密码后回车后如果密码正确控制台就变成root@***:/# 了. #2.更新软件源 apt ...
- python 类的封装/property类型/和对象的绑定与非绑定方法
目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...
- 水题:UVa213- Message Decoding
Message Decoding Some message encoding schemes require that an encoded message be sent in two parts. ...
- foreach ($users as $key=>$value)
1: foreach(array_name as $value) { statement; } 这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$ ...
- .Net Task常见问题
最近尝试使用一下Task,但是使用过程中因为API的不熟悉碰到了很多问题,不清楚什么时间来调用Task.Start(),具体该怎么使用等等. 如下所描述的Task.Start()方法均为实例方法. 1 ...
- MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?
一条SQL查询语句是如何执行的? 前言 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MyS ...
- 29、在android中采用动画方案来弹出窗口
1.自定义style 2.使用方法: buttonWhat.setOnClickListener(new OnClickListener() { @Override public void onCli ...
- day01_11.break和continue
1.continue 下一个(用next更加形象一点)整体的循环没有被破坏掉,而是跳到下一个循环单位中 <?php for($i=1;$i<=10;$i++){ if($i==4){ co ...
- Octave 里的 fminunc
ptions = optimset('GradObj', 'on', 'MaxIter', '100'); initialTheta = zeros(2,1); [optTheta, function ...