AHOI 2009 (BZOJ1798)维护序列 seq (线段树好题?)
我是不会说这个题很坑的。。
改了一晚上。。。
// by SiriusRen
#include <cstdio>
#define N 150000
#define LSON l,mid,lson
#define RSON mid+1,r,rson
#define LL long long
using namespace std;
LL n,m,mod,xx,yy,zz,jy;
LL mul[N*4],add[N*4],sum[N*4];
int get(){
int x=0;char p=getchar();
while(p<'0'||p>'9')p=getchar();
while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
return x;
}
void build(int l,int r,int pos){
mul[pos]=1;
if(l==r){sum[pos]=get();return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(LSON);build(RSON);
sum[pos]=(sum[lson]+sum[rson])%mod;
}
void push_down(int pos,int lson,int rson,int num){
mul[lson]=(mul[pos]*mul[lson])%mod;
mul[rson]=(mul[pos]*mul[rson])%mod;
add[lson]=(add[lson]*mul[pos]+add[pos])%mod;
add[rson]=(add[rson]*mul[pos]+add[pos])%mod;
sum[lson]=(sum[lson]*mul[pos]+add[pos]*(num-(num>>1)))%mod;
sum[rson]=(sum[rson]*mul[pos]+add[pos]*(num>>1))%mod;
mul[pos]=1;add[pos]=0;
}
void update(int l,int r,int pos){
if(l>=xx&&r<=yy){
if(jy==1){
mul[pos]=(mul[pos]*zz)%mod;
add[pos]=(add[pos]*zz)%mod;
sum[pos]=(sum[pos]*zz)%mod;
}
else{
add[pos]=(add[pos]+zz)%mod;
sum[pos]=(sum[pos]+(r-l+1)*zz)%mod;
}
return;
}
int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
if(mul[pos]!=1||add[pos])
push_down(pos,lson,rson,r-l+1);
if(mid>=xx)update(LSON);
if(mid<yy)update(RSON);
sum[pos]=(sum[lson]+sum[rson])%mod;
}
int query(int l,int r,int pos){
int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
if(l>=xx&&r<=yy){
return sum[pos];
}
if(mul[pos]!=1||add[pos])
push_down(pos,lson,rson,r-l+1);
if(mid>=yy)return query(LSON);
else if(mid<xx)return query(RSON);
else return (query(LSON)+query(RSON))%mod;
}
int main(){
n=get();mod=get();
build(1,n,1);
m=get();
while(m--){
jy=get();xx=get();yy=get();
if(jy!=3) zz=get(),update(1,n,1);
else printf("%d\n",query(1,n,1));
}
}
AHOI 2009 (BZOJ1798)维护序列 seq (线段树好题?)的更多相关文章
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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 老师交给小可可一个维护数列的任务,现在小可 ...
- 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 线段树多标记(区间加+区间乘)
[题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...
- bzoj 1798 维护序列seq 线段树
裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798 先乘后加,就可给加法标记乘上乘法标记. 注意可能有 *0 的操作,所以 pshd 时不 ...
随机推荐
- 深圳面试一周记录——.NET(B/S)开发
个人简单信息:2011年毕业,最高学历大专,最近一份工作在广州:有做架构设计经验,有一年的带团队(10人左右)经验:互联网和行业软件公司都待过. 为免不必要的争论,本文说地址的就不说公司行业,说公司行 ...
- 08--MOOC--C/C++ 根据年月日计算星期几
计算任何一天是星期几的几种算法 一:常用公式 W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D Y是年份数,D是这一天在这一年中的累积天数,也 ...
- js对cookie增删改查的封装
/** * 获取cookie * @param name * @returns {*} */ function getCookie(name) { var cookieArr = document.c ...
- Java继承实现接口的抽象类
1.TestIntace.java package com.chase.abstrac; /** * 接口 * @author Chase * * @date 2013-10-21 下午02:29:1 ...
- eas之怎么设置单据保存或者提交完不跳到下个新增页面
this.chkMenuItemSubmitAndAddNew.setSelected(false);
- 15.4 Task 异步匿名函数
Func<int, Task<int>> func = async x => { Console.WriteLine("starting x={0}" ...
- centos7系统修改内核
修改centos6的内核启动顺序,只需要修改/etc/grub.conf 里的default项配置即可.那么centos7系统该如何修改呢? 下面就centos7系统修改内核,做如下记录: 一般在编译 ...
- Linux运维工程师学习大纲
linux运维课程大纲: Linux运维: Linux系统管理: Linux服务及安全管理: httpd,lamp,lnmp cache:memcached,varnish DB:mysql(mari ...
- 5.win上安装ES
安装步骤如下: 1.安装JDK 至少1.8.0_73以上版本,使用 java -version 这个命令进行查看java的版本 2.下载和解压缩Elasticsearch安装包, 解压后目录结构: 3 ...
- 【习题4-1 Uva1589】Xiangqi
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 车是可以被吃掉的... 注意这个情况. 其他的模拟即可. [代码] #include <bits/stdc++.h> u ...