bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1798
【题意】
给定一个序列,要求提供区间乘/加,以及区间求和的操作
【思路】
线段树+传标。
下传标记的方式可以类比这里 click here
【代码】
- #include<set>
- #include<cmath>
- #include<queue>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
- #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
- using namespace std;
- typedef long long ll;
- const int N = 2e5+;
- ll read() {
- char c=getchar();
- ll f=,x=;
- while(!isdigit(c)) {
- if(c=='-') f=-; c=getchar();
- }
- while(isdigit(c))
- x=x*+c-'',c=getchar();
- return x*f;
- }
- int MOD ;
- struct Tnode {
- int u,l,r;
- ll sum,add,mul;
- void mulv(ll x) ;
- void addv(ll x) ;
- void pushdown() ;
- void maintain() ;
- } T[N<<] ;
- void Tnode::mulv(ll x) {
- mul=(mul*x)%MOD;
- sum=(sum*x)%MOD;
- add=(add*x)%MOD;
- }
- void Tnode::addv(ll x) {
- sum=(sum+(r-l+)*x)%MOD;
- add=(add+x)%MOD;
- }
- void Tnode::pushdown() {
- if(mul!=) {
- T[u<<].mulv(mul);
- T[u<<|].mulv(mul);
- mul=;
- }
- if(add) {
- T[u<<].addv(add);
- T[u<<|].addv(add);
- add=;
- }
- }
- void Tnode::maintain() {
- sum=(T[u<<].sum+T[u<<|].sum)%MOD;
- }
- void update(int u,int L,int R,int x,int flag) {
- T[u].pushdown();
- if(L<=T[u].l&&T[u].r<=R) {
- if(flag==) T[u].addv(x);
- else T[u].mulv(x);
- } else {
- int mid=T[u].l+T[u].r>>;
- if(L<=mid) update(u<<,L,R,x,flag);
- if(mid<R) update(u<<|,L,R,x,flag);
- T[u].maintain();
- }
- }
- ll query(int u,int L,int R) {
- T[u].pushdown();
- if(L<=T[u].l&&T[u].r<=R)
- return T[u].sum;
- else {
- int mid=T[u].l+T[u].r>>;
- ll ans=;
- if(L<=mid) ans=(ans+query(u<<,L,R))%MOD;
- if(mid<R) ans=(ans+query(u<<|,L,R))%MOD;
- return ans;
- }
- }
- int n,m; ll a[N];
- void build(int u,int l,int r) {
- T[u]=(Tnode){u,l,r,,,};
- if(l==r) {
- T[u].sum=a[l]%MOD;
- return ;
- } else {
- int mid=l+r>>;
- build(u<<,l,mid);
- build(u<<|,mid+,r);
- T[u].maintain();
- }
- }
- /* Debug
- int print(int u) {
- T[u].pushdown();
- if(T[u].l==T[u].r) printf("%d,%d\n",T[u].l,T[u].v);
- else {
- print(u<<1),print(u<<1|1);
- }
- }
- */
- int main()
- {
- // freopen("in.in","r",stdin);
- // freopen("out.out","w",stdout);
- n=read(),MOD=read();
- FOR(i,,n) a[i]=read();
- build(,,n);
- m=read();
- int op,l,r,x;
- FOR(i,,m) {
- op=read(),l=read(),r=read();
- if(op==) {
- x=read();
- update(,l,r,x,);
- } else
- if(op==) {
- x=read();
- update(,l,r,x,);
- } else {
- printf("%lld\n",query(,l,r));
- }
- }
- return ;
- }
P.S.我竟然蛋疼的存了一个v,还一本正经地累计到sum里 <_<
bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)的更多相关文章
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- 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 ...
- 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 ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
随机推荐
- eclipse中(装了插件m2eclipse后的)导入maven工程显示"感叹号"
有时候导入一些开源工程(maven结构的),在eclipse中(装了插件m2eclipse后的)该工程前面会有一个小的红色感叹号,但点开工程后没有发现有打小红叉的内容,这种情况其实大部分是jar包 ...
- 2410中断中SRCPND和INTPND清零的疑问
2410中断中SRCPND和INTPND清零的疑问SRCPND是中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位 ...
- Qt网络通信骨架解析,QtClient QtServer QtSerialPort
http://blog.csdn.net/Dr_Abel/article/details/52469134#t18
- 251. Flatten 2D Vector
题目: Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6 ...
- office开发心得——基于模板开发
这几天正在写一个小程序,但用到生成word表格和Excel表格.到网上查了一些资料,发现如果生成表格模板相对比较固定即可把其制作成模板,需要设置什么格式可以直接在模板中设置,而程序仅需替换相应的内容即 ...
- 使用Maven创建一个Spring MVC Web 项目
使用Maven创建java web 项目(Spring MVC)用到如下工具: 1.Maven 3.2 2.IntelliJ IDEA 13 3.JDK 1.7 4.Spring 4.1.1 rele ...
- yeoman错误提示
运行 yo angular 出现如下提示: $ yo angular grunt-cli: The grunt command line interface. (v0.1.9) Fatal error ...
- find-all-duplicates-in-an-array(典型的数组中的重复数,不错,我做出来了,可是发现别人有更好的做法)
https://leetcode.com/problems/find-all-duplicates-in-an-array/ 典型的数组中的重复数.这次是通过跳转法,一个个跳转排查的.因为查过的不会重 ...
- bzoj1562
很明显是二分图匹配,关键是怎么求字典序最小 想到两种做法,首先是直接匹配,然后从第一位贪心调整 第二种是从最后一个倒着匹配,每次匹配都尽量选小的,这样一定能保证字典序最小 type node=reco ...
- asp.net获取当前页面源码并生成静态页面
StringWriter stringWriter = new StringWriter(); HtmlTextWriter htmlWriter = new HtmlTextWriter(strin ...