WHU 1464(线段树减,除,区间求和)
来源:互联网 发布:淘宝店铺模板有什么用 编辑:程序博客网 时间:2024/06/07 02:49
problem
N个数,M个操作,操作有三类:
1. D,A,B,C 区间[a,b]中 所有数除以C,计算机整除
2. M,A,B,C 区间[a,b]所有数减去C
3. S,A,B 区间[a,b]求和,输出结果
思路
注意
1.除法不能打lazy(计算机整除问题)而是更新到底,复杂度可以保证(log级别),因为很快降到0
2.注意减法与除法的融合
代码示例
#include<cstdio>#include<cstdlib>#include<cstdlib>#include<algorithm>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;typedef long long LL;const int maxn=5e5+10;LL sum[maxn<<2], add[maxn<<2];bool flag[maxn<<2];void push_up(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; flag[rt]=flag[rt<<1] | flag[rt<<1|1];}void push_down(int rt,int len){ if(add[rt]){ add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=add[rt]*(len-(len>>1)); sum[rt<<1|1]+=add[rt]*(len>>1); add[rt]=0; }}void build(int l,int r,int rt){ sum[rt]=add[rt]=0; if(l==r){ scanf("%lld",&sum[rt]); flag[rt]=(sum[rt]>0); return; } int m=(l+r)>>1; build(lson); build(rson); push_up(rt);}void Minus(int L,int R,int c,int l,int r,int rt){ if(L<=l&&r<=R){ add[rt]+=c; sum[rt]+=(r-l+1)*c; return; } push_down(rt,r-l+1); int m=(l+r)>>1; if(L<=m) Minus(L,R,c,lson); if(R>m) Minus(L,R,c,rson); push_up(rt);}void Division(int L,int R,int c,int l,int r,int rt){ if(flag[rt]==0) return; if(l==r){ if(sum[rt]>0) sum[rt]/=(LL)c; flag[rt]=(sum[rt]>0); return; } push_down(rt,r-l+1); int m=(l+r)>>1; if(L<=m) Division(L,R,c,lson); if(R>m) Division(L,R,c,rson); push_up(rt);}LL Sum(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) return sum[rt]; push_down(rt,r-l+1); int m=(l+r)>>1; LL res = 0; if(L<=m) res+=Sum(L,R,lson); if(R>m) res+=Sum(L,R,rson); return res;}int main(){// freopen("D.in","r", stdin);// freopen("test.out","w",stdout); int T; scanf("%d",&T); for(int Case=1;Case<=T;Case++){ int n,m,a,b,c; char op[10]; scanf("%d%d", &n,&m); printf("Case %d:\n",Case); build(1,n,1); for(int i = 0;i<m;i++){ scanf("%s",op); if(op[0]=='D'){ scanf("%d%d%d",&a,&b,&c); if(c==1) continue; Division(a,b,c,1,n,1); } else if(op[0]=='M'){ scanf("%d%d%d",&a,&b,&c); Minus(a,b,-c,1,n,1); } else{ scanf("%d%d",&a,&b); LL res=Sum(a,b,1,n,1); printf("%lld\n",res); } } puts(""); } return 0;}
阅读全文
1 0
- WHU 1464(线段树减,除,区间求和)
- 线段树区间求和
- poj3468(线段树区间求和)
- poj3468 线段树区间求和
- 线段树区间更新+求和
- 线段树(区间修改,区间求和)
- poj3468 线段树区间更新,区间求和
- codevs1080 线段树(区间修改+区间求和
- 线段树+区间xor+区间求和
- 【线段树】区间求和+区间修改(区间加)
- HDU 1166(线段树,区间求和)
- poj 3468(线段树应用:区间求和)
- hdu3874/hdu3333 线段树区间求和
- hdu1698(线段树染色区间求和)
- HDU1698(线段树区间更新求和)
- 线段树(区间更新求和)
- 线段树(单点更新,区间求和)
- 线段树 (区间更新求和)
- 《Win32多线程程序设计》之线程同步
- Java常用API----包装类
- Python猜数
- Kd-Tree算法原理简析
- postgres的导出和备份
- WHU 1464(线段树减,除,区间求和)
- IO/InputStream
- select poll epoll总结
- Linux软链接和硬链接
- LeetCode Binary Tree Tilt
- 2.2 数据类型2: Numeric & String
- mac Alfred+Dash快速查询API文档
- 强联通分量 缩点 tarjan 入门题小集
- python中的匿名函数lambda