P3373 线段树模板
好,这是一个线段树模板。
#include <cstdio>
using namespace std;
const long long int N=;
long long int sum[N],tag1[N],tag2[N],mo; void build(int l,int r,int o)
{
tag1[o]=;
if(l==r)
{
scanf ("%d",&sum[o]);
return;
}
int mid=(l+r)>>;
build(l,mid,o<<);
build(mid+,r,o<<|);
sum[o]=(sum[o<<]+sum[o<<|])%mo;
return;
}
void down(int l,int r,int o)
{
tag1[o<<]=tag1[o<<]*tag1[o]%mo;
tag1[o<<|]=tag1[o<<|]*tag1[o]%mo;
tag2[o<<]=(tag2[o<<]*tag1[o]+tag2[o])%mo;
tag2[o<<|]=(tag2[o<<|]*tag1[o]+tag2[o])%mo;
int mid=(l+r)>>;
sum[o<<]=(sum[o<<]*tag1[o]+tag2[o]*(mid-l+))%mo;
sum[o<<|]=(sum[o<<|]*tag1[o]+tag2[o]*(r-mid))%mo;
tag1[o]=;
tag2[o]=;
return;
} void add(int L,int R,int v,int l,int r,int o)
{
if(L<=l && r<=R)
{
tag2[o]=(tag2[o]+v)%mo;
sum[o]=(sum[o]+v*(r-l+))%mo;
return;
}
if(r<L || R<l) return;
down(l,r,o);
int mid=(l+r)>>;
if(L<=mid) add(L,R,v,l,mid,o<<);
if(mid<R) add(L,R,v,mid+,r,o<<|);
sum[o]=(sum[o<<]+sum[o<<|])%mo;
return;
}
void mul(int L,int R,int v,int l,int r,int o)
{
if(L<=l && r<=R)
{
tag1[o]=tag1[o]*v%mo;
tag2[o]=tag2[o]*v%mo;
sum[o]=sum[o]*v%mo;
return;
}
if(r<L || R<l) return;
down(l,r,o);
int mid=(l+r)>>;
if(L<=mid) mul(L,R,v,l,mid,o<<);
if(mid<R) mul(L,R,v,mid+,r,o<<|);
sum[o]=(sum[o<<]+sum[o<<|])%mo;
return;
}
long long int ask_sum(int L,int R,int l,int r,int o)
{
if(L<=l && r<=R) return sum[o];
if(r<L || R<l) return ;
int mid=(l+r)>>;
down(l,r,o);
long long int ans=ask_sum(L,R,l,mid,o<<);
ans=ans+ask_sum(L,R,mid+,r,o<<|)%mo;
sum[o]=(sum[o<<]+sum[o<<|])%mo;
return ans%mo;
}
int main()
{
int n,m;
scanf ("%d%d%d",&n,&m,&mo);
build(,n,);
while(m--)
{
int flag,x,y,c;
scanf ("%d",&flag);
if(flag==)
{
scanf ("%d%d%d",&x,&y,&c);
mul(x,y,c,,n,);
}
else if(flag==)
{
scanf ("%d%d%d",&x,&y,&c);
add(x,y,c,,n,);
}
else
{
scanf ("%d%d",&x,&y);
printf("%lld\n",ask_sum(x,y,,n,));
}
}
return ;
}
模板在此
就这样。
2018.06.16
今天心血来潮准备打个线段树模板玩,结果调了TM一个多小时...
一交先是RE(我明明开足了4倍空间),然后又T(你在打我脸),最后加个快读终于A了,气死我了。
#include <cstdio>
typedef long long LL;
const int N = ; LL MO; inline void Read(LL &x) {
x = ;
char c = getchar();
while(c < '' || c > '') {
c = getchar();
}
while(c <= '' && c >= '') {
x = (x << ) + (x << ) + c - ;
c = getchar();
}
return;
} struct SegmentTree {
LL sum[N << ], tag1[N << ], tag2[N << ];
int l[N << ], r[N << ]; inline void update(int o) {
sum[o] = sum[o << ] + sum[o << | ] % MO;
return;
}
inline void pushdown(int o) {
if(!tag2[o] && tag1[o] == ) {
return;
} int ls = o << ;
int rs = ls | ;
int mid = (l[o] + r[o]) >> ; tag1[ls] = tag1[ls] * tag1[o] % MO;
tag2[ls] = (tag2[ls] * tag1[o] % MO + tag2[o]) % MO;
sum[ls] = (sum[ls] * tag1[o] % MO + tag2[o] * (mid - l[o] + ) % MO) % MO; tag1[rs] = tag1[rs] * tag1[o] % MO;
tag2[rs] = (tag2[rs] * tag1[o] % MO + tag2[o]) % MO;
sum[rs] = (sum[rs] * tag1[o] % MO + tag2[o] * (r[o] - mid) % MO) % MO; tag1[o] = ;
tag2[o] = ;
return;
}
void build(int o, int _l, int _r) {
l[o] = _l;
r[o] = _r;
tag1[o] = ;
tag2[o] = ;
if(_l == _r) {
Read(sum[o]);
sum[o] %= MO;
return;
}
int ls = o << ;
int rs = ls | ;
int mid = (_l + _r) >> ;
build(ls, _l, mid);
build(rs, mid + , _r);
update(o);
return;
}
void add(int L, int R, int o, LL v) {
if(L <= l[o] && r[o] <= R) {
tag2[o] = (v + tag2[o]) % MO;
sum[o] = (sum[o] + v * (r[o] - l[o] + ) % MO) % MO;
return;
}
if(r[o] < L || R < l[o]) {
return;
} pushdown(o);
int ls = o << ;
int rs = ls | ;
int mid = (l[o] + r[o]) >> ; if(L <= mid) {
add(L, R, ls, v);
}
if(mid < R) {
add(L, R, rs, v);
}
update(o);
return;
}
void mul(int L, int R, int o, LL v) {
if(L <= l[o] && r[o] <= R) {
tag1[o] = v * tag1[o] % MO;
tag2[o] = v * tag2[o] % MO;
sum[o] = (sum[o] * v) % MO;
return;
}
if(r[o] < L || R < l[o]) {
return;
} pushdown(o);
int ls = o << ;
int rs = ls | ;
int mid = (l[o] + r[o]) >> ; if(L <= mid) {
mul(L, R, ls, v);
}
if(mid < R) {
mul(L, R, rs, v);
}
update(o);
return;
}
LL ask(int L, int R, int o) {
if(L <= l[o] && r[o] <= R) {
return sum[o];
}
if(r[o] < L || R < l[o]) {
return ;
} pushdown(o);
int ls = o << ;
int rs = ls | ;
int mid = (l[o] + r[o]) >> ; LL ans = (ask(L, R, ls) + ask(L, R, rs)) % MO;
return ans;
}
}SegT; int main() {
int n, m;
scanf("%d%d%lld", &n, &m, &MO);
SegT.build(, , n);
for(int i = , x, y, f; i <= m; i++) {
scanf("%d%d%d", &f, &x, &y);
if(f == ) {
printf("%lld\n", SegT.ask(x, y, ));
}
else {
LL k;
scanf("%lld", &k);
if(f == ) {
SegT.mul(x, y, , k);
}
else {
SegT.add(x, y, , k);
}
}
} return ;
}
船新模板(加了快读居然还比上面那个慢)
P3373 线段树模板的更多相关文章
- 洛谷P3373线段树模板2
题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- 线段树模板hdu 1754:I Hate It
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- UESTC - 1057 秋实大哥与花 线段树模板题
http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
- hdu 4819 二维线段树模板
/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...
- POJ3468:A Simple Problem with Integers(线段树模板)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 149972 ...
- HDU1166:敌兵布阵(线段树模板)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- 国内的go get问题的解决
在国内采用go get有时会下载不到一些网站如golang.org的依赖包. 方法1(亲测有效): gopm 代替go 下载第三方依赖包可以采用gopm从golang.org一些镜像网站上下载. 注意 ...
- python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- Slave_SQL_Running:No的两种解决办法
进入slave服务器,运行: mysql> show slave status\G ....... Relay_Log_File: localhost-relay-bin. Relay_Log_ ...
- ssl证书部署问题
问:我现在得到的ssl证书是.crt和.key两个在nginx环境下部署的证书,如果我们改用是tomcat,现在把这两个文件合成了.jks给tomcat使用,合成的时候输入的jks密码是不是就是部署在 ...
- lr分布式测试--笔记
LR 架构: controller做测试控制 scenario做测试场景的控制 vuser模拟用户和 load generator做负载产生 通过MI listener 跨防火墙监听 来实现分布式测试 ...
- Maven问题:Failure to transfer org.apache.maven
Maven报错:Failure to transfer org.apache.maven 在创建Maven项目时,经常会在pom.xml的第一行处报错,提示信息如下: Failure to trans ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- rmse均方根误差
rmse=sqrt(sum((w-r).^2)/length(w))
- Web API 2 使用SSL
在Server上启用SSL 稍后我会想在IIS 7 上配置SSL,现在先往下看. 本地测试,您可以启用SSL的IIS Express Visual Studio.在属性窗口中,启用SSL设置为True ...
- Android 取消标题栏
有很多种方法. 但一般多个页面的话,大多会在AndroidManifest.xml文件中设置 那么这里你需要注意了. 第一种: 如果style.xml 的 parent 是 <style n ...