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 ...
随机推荐
- Vagrant系列(二)----Vagrant的配置文件Vagrantfile详解
一.简介 在我们的工作目录下有一个Vagrantfile文件,里面包含有大量的配置信息,通过它可以定义虚拟机的各种配置,如网络.内存.主机名等,主要包括三个方面的配置,虚拟机的配置.SSH配置.Vag ...
- Jenkins配置权限管理
借鉴博客:https://www.cnblogs.com/Eivll0m/p/6734076.html 懒得写了,照上面是配置成功了,弄了权限角色与用户的配置
- 通用模块设计UMD
https://leohxj.gitbooks.io/front-end-database/content/javascript-modules/about-umd.html UMD(universa ...
- Java Json 数据下划线与驼峰格式进行相互转换
概述 今天遇见一个需求,需要对json数据进行下划线与驼峰格式之间进行转换,在Fastjson.Jackson.Gson都提供了转换的方式,在这里进行一下列举. User类: public class ...
- linux下ssh无法连接的原因
在虚拟机上安装了ubuntu16.04 server,用本机 ssh 连接的时候 无法连接上: 忽然想起在安装的时候有个openssh好像没有勾选,所以在虚拟机上 apt install openss ...
- Linux下 rewrite_mod 的配置
以下使用最新的 Ubuntu 16.04 测试; 安装好apache后先确认有没有rewrite模块,大多数情况下是有的:ls /etc/apache2/mods-available |grep re ...
- How to helloworld on Xcode
create a mac app,click button to change label text? create project,click left window button on Main. ...
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...
- SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。
为每个内容数据库设置 BLOB 存储 启用并配置 FILESTREAM 之后,请按照以下过程在文件系统中设置 BLOB 存储.必须为要对其使用 RBS 的每个内容数据库设置 BLOB 存储. 设置 ...
- B-树 B+树复习总结
一.B-树的定义 一棵m阶的B-树或为空树,或为具有以下特性的m叉树 1.树中每个结点至多有m棵子树 (m-1个关键字) 2.根结点至少有两棵子树 (至少有一个关键字) 3.除根节点的分支结点至少有f ...