题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798


大概就是维护两个标记的线段树模板题。

设定优先级,先乘后加(只是相对的),$pushdown$的时候乘法标记直接乘,加法标记先乘上父亲的乘法标记再加上父亲的加法标记。


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1001000
#define llg long long
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,md; struct SEGMENT_TREE
{
llg val[maxn],addv[maxn],mul[maxn];
bool bj[maxn];
void init(){memset(val,,sizeof(val)); memset(mul,,sizeof(mul)); memset(addv,,sizeof(addv)); memset(bj,,sizeof(bj));} void build(llg o,llg l,llg r)
{
if (l==r)
{
addv[o]=,mul[o]=;
scanf("%lld",&val[o]);
return ;
}
llg mid=(l+r)>>,lc=o<<,rc=o<<|;
build(lc,l,mid);
build(rc,mid+,r);
val[o]=val[lc]+val[rc];
mul[o]=; addv[o]=;
} void pushdown(llg o,llg l,llg r)
{
llg lc=o<<,rc=o<<|;
mul[lc]*=mul[o],mul[lc]%=md;
mul[rc]*=mul[o],mul[rc]%=md;
addv[lc]*=mul[o],addv[lc]%=md;
addv[rc]*=mul[o],addv[rc]%=md;
addv[lc]+=addv[o],addv[lc]%=md;
addv[rc]+=addv[o],addv[rc]%=md;
val[o]=val[o]*mul[o]+addv[o]*(r-l+); val[o]%=md;
addv[o]=,mul[o]=;
} void add_(llg o,llg l,llg r,llg L,llg R,llg V)
{
pushdown(o,l,r);
if (L>r || R<l) return ;
if (l>=L && r<=R)
{
addv[o]+=V;
pushdown(o,l,r);
return ;
}
llg mid=(l+r)>>,lc=o<<,rc=o<<|;
add_(lc,l,mid,L,R,V);
add_(rc,mid+,r,L,R,V);
val[o]=val[lc]+val[rc]; val[o]%=md;
} void mul_(llg o,llg l,llg r,llg L,llg R,llg V)
{
pushdown(o,l,r);
if (L>r || R<l) return ;
if (l>=L && r<=R)
{
mul[o]*=V;
pushdown(o,l,r);
return ;
}
llg mid=(l+r)>>,lc=o<<,rc=o<<|;
mul_(lc,l,mid,L,R,V);
mul_(rc,mid+,r,L,R,V);
val[o]=val[lc]+val[rc]; val[o]%=md;
} llg sum(llg o,llg l,llg r,llg L,llg R)
{
pushdown(o,l,r);
if (L>r || R<l) return ;
if (l>=L && r<=R)
{
return val[o];
}
llg mid=(l+r)>>,lc=o<<,rc=o<<|,tot=;
tot+=sum(lc,l,mid,L,R);
tot+=sum(rc,mid+,r,L,R);
val[o]=val[lc]+val[rc]; val[o]%=md;
return tot%md;
} }tree; int main()
{
tree.init();
yyj("a");
cin>>n>>md;
tree.build(,,n);
llg T,type,l,r,v;
cin>>T;
while (T--)
{
scanf("%lld",&type);
if (type==)
{
scanf("%lld%lld%lld",&l,&r,&v);
tree.mul_(,,n,l,r,v);
}
if (type==)
{
scanf("%lld%lld%lld",&l,&r,&v);
tree.add_(,,n,l,r,v);
}
if (type==)
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",tree.sum(,,n,l,r));
}
}
return ;
}

【BZOJ】1798: [Ahoi2009]Seq 维护序列seq的更多相关文章

  1. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  2. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  3. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  4. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

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

  5. 1798: [Ahoi2009]Seq 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 2930  Solved: 1087[Submit ...

  6. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  7. BZOJ1798: [Ahoi2009]Seq 维护序列seq

    传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...

  8. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...

  9. bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...

随机推荐

  1. oracle数据库基础功能

    一.oracle基本常用的数据类型 varchar(长度) 字符串char(长度) 字符number(x,y) x表示总位数 y表示保留小数点后几位数 eg面试题:number(5,3)最大的数是99 ...

  2. VMWare常用快捷键

    VMWare常用快捷键 Ctrl-Alt-Enter    进入全屏模式 ctrl+alt+insert      退出全屏 Ctrl-Alt            返回正常(窗口)模式 Ctrl-A ...

  3. Java 代码性能调优“三十六”策

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  4. Eloquent JavaScript #02# program_structure

    第一章中作者介绍了各种值,但是这些独立的值是没有意义的,只有当值放在更大的框架的时候才会彰显它们的价值.所以第二章开始介绍程序结构. 1.var VS. let 以及 const 作者推荐用 let ...

  5. Docker学习笔记之Docker 的简历

    0x00 概述 在了解虚拟化和容器技术后,我们就更容易理解 Docker 的相关知识了.在这一小节中,我将介绍关于 Docker 的出现和发展,Docker 背后的技术.同时,我们将阐述 Docker ...

  6. Java中五种遍历HashMap的方式

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Java8Templat ...

  7. Golang生成区间随机整数

    package main import ( "fmt" "math/rand" "time" ) func main() { rand.Se ...

  8. django加载静态文件

    在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件. js 执行文件以及一些图片等,因此在 DTL 中加载静态文件是一个必须要解决的问题.在 DTL 中,使用 static 标签来 ...

  9. 前端诡异参数start

    今天搞了一下午只为一个诡异事件:前端请求数据时总是会传一个start=20的参数,二搜索整个项目也找不出这个start的踪影. 倒是搜到一个pageLength的参数是20,但就是找不到start. ...

  10. oci7编译报’olog’等未定义的引用问题

    前一天在测试一个数据导出的时候,发现oci7编译的时候报了一大堆类似"’oparse’未定义的引用问题",这通常是因为找不到实现库的原因,但是oci相关的库又都是存在的,用oci7 ...