好,这是一个线段树模板。

 #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 线段树模板的更多相关文章

  1. 洛谷P3373线段树模板2

    题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...

  2. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  3. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  4. 线段树模板hdu 1754:I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. UESTC - 1057 秋实大哥与花 线段树模板题

    http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...

  6. POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 140120 ...

  7. hdu 4819 二维线段树模板

    /* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...

  8. POJ3468:A Simple Problem with Integers(线段树模板)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 149972 ...

  9. HDU1166:敌兵布阵(线段树模板)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Vagrant系列(二)----Vagrant的配置文件Vagrantfile详解

    一.简介 在我们的工作目录下有一个Vagrantfile文件,里面包含有大量的配置信息,通过它可以定义虚拟机的各种配置,如网络.内存.主机名等,主要包括三个方面的配置,虚拟机的配置.SSH配置.Vag ...

  2. Jenkins配置权限管理

    借鉴博客:https://www.cnblogs.com/Eivll0m/p/6734076.html 懒得写了,照上面是配置成功了,弄了权限角色与用户的配置

  3. 通用模块设计UMD

    https://leohxj.gitbooks.io/front-end-database/content/javascript-modules/about-umd.html UMD(universa ...

  4. Java Json 数据下划线与驼峰格式进行相互转换

    概述 今天遇见一个需求,需要对json数据进行下划线与驼峰格式之间进行转换,在Fastjson.Jackson.Gson都提供了转换的方式,在这里进行一下列举. User类: public class ...

  5. linux下ssh无法连接的原因

    在虚拟机上安装了ubuntu16.04 server,用本机 ssh 连接的时候 无法连接上: 忽然想起在安装的时候有个openssh好像没有勾选,所以在虚拟机上 apt install openss ...

  6. Linux下 rewrite_mod 的配置

    以下使用最新的 Ubuntu 16.04 测试; 安装好apache后先确认有没有rewrite模块,大多数情况下是有的:ls /etc/apache2/mods-available |grep re ...

  7. How to helloworld on Xcode

    create a mac app,click button to change label text? create project,click left window button on Main. ...

  8. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...

  9. SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。

    为每个内容数据库设置 BLOB 存储   启用并配置 FILESTREAM 之后,请按照以下过程在文件系统中设置 BLOB 存储.必须为要对其使用 RBS 的每个内容数据库设置 BLOB 存储. 设置 ...

  10. B-树 B+树复习总结

    一.B-树的定义 一棵m阶的B-树或为空树,或为具有以下特性的m叉树 1.树中每个结点至多有m棵子树 (m-1个关键字) 2.根结点至少有两棵子树 (至少有一个关键字) 3.除根节点的分支结点至少有f ...