【BZOJ】1798: [Ahoi2009]Seq 维护序列seq
题目链接: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的更多相关文章
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq
传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...
- 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...
随机推荐
- POJ 1018 Communication System (动态规划)
We have received an order from Pizoor Communications Inc. for a special communication system. The sy ...
- Linux 进程管理 ps、top、pstree命令
ps命令:查看系统中正在运行的进程 ps 是用来静态地查看系统中正在运行的进程的命令.不过这个命令有些特殊,它的部分选项不能加入"-",比如命令"ps aux" ...
- windows无法远程连接linux
网络模式 修改对应的NAT模式,子网地址的前三位要与window,internet协议版本里的IP地址的前三位一致.
- 纯Java增删改查
//自己写的一个完整的带增删改查提交重置功能的表单代码.package com.l16.test5;import java.awt.Color;import java.awt.Container;im ...
- linux python3 安装scrapy 后提示 -bash: scrapy: 未找到命令
https://blog.csdn.net/dangsh_/article/details/79613210
- 基于SSL的MySQL主从
master 端 配置CA和证书 [root@baseos-1_192.168.31.140 ~]# cd /etc/pki/CA/ #生成根证书的私钥 [root@baseos-1_192.168. ...
- django模板常用过滤器—add、cut、date
语法格式:{{ obj | filter:para }} add过滤器:将两个数相加或字符串.列表等进行拼接 views.py def add(request): context={'l1':[1 ...
- 使ipconfig命令结果更整洁
在windows下,使用ipconfig命令会出来很多内容,很多事ipv6隧道适配器的内容.而现在大部分人都还用不到ipv6,因此我们可以输入以下命令关闭ipv6隧道适配器,使命令结果更整洁. net ...
- 将svn下载的项目转化为java project
1.选中项目,右键点击弹出窗口,点击窗口中的[Properties],弹出[Properties for test]窗口, 如下: 2.点击窗口中的[Project Facets],右边显示[Conv ...
- topcoder srm 680 div1
problem1 link 将限制按照$x$排序.那么$[upTo_{i}+1,upTo_{i+1}]$中数字个数为$quantity_{i+1}-quantity_{i}$.然后进行动态规划.$f[ ...