线段树_懒标记
2013-11-05 21:47
274 查看
题目是wikioi1082
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; const int maxn=200000*4+10; long long sum[maxn],a[maxn],d[maxn]; int n,q; void init() { freopen("4.in","r",stdin); freopen("4.out","w",stdout); } void buildtree(int k,int x,int y) { if(x==y) { sum[k]=a[x]; return; } int t=x+((y-x)>>1); buildtree(2*k,x,t); buildtree(2*k+1,t+1,y); sum[k]=sum[2*k]+sum[2*k+1]; } void readdata() { memset(sum,0,sizeof(sum)); memset(d,0,sizeof(0)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&q); buildtree(1,1,n); } void xiugai(int k,int x,int y,int l,int r,int da) { if(l>y||r<x) return; if(l<=x&&r>=y) { d[k]+=da; return; } if(d[k]) { d[k*2]+=d[k]; d[k*2+1]+=d[k]; d[k]=0; } int t=x+((y-x)>>1); xiugai(2*k,x,t,l,r,da); xiugai(2*k+1,t+1,y,l,r,da); sum[k]=sum[2*k]+d[k*2]*(t-x+1)+d[k*2+1]*(y-t)+sum[2*k+1]; } long long chakan(int k,int x,int y,int l,int r) { if(l>y||r<x)return 0; if(l<=x&&r>=y) { return d[k]*(y-x+1)+sum[k]; } if(d[k]) { d[k*2]+=d[k]; d[k*2+1]+=d[k]; d[k]=0; } int t=x+((y-x)>>1); long long res = chakan(2*k,x,t,l,r)+chakan(2*k+1,t+1,y,l,r); sum[k]=sum[2*k]+d[k*2]*(t-x+1)+d[k*2+1]*(y-t)+sum[2*k+1]; return res; } void work() { for(int i=1;i<=q;i++) { int biaozhi,x,y,da; scanf("%d",&biaozhi); if(biaozhi==1) { scanf("%d%d%d",&x,&y,&da); xiugai(1,1,n,x,y,da); } if(biaozhi==2) { scanf("%d%d",&x,&y); printf("%lld\n",chakan(1,1,n,x,y)); } } } int main() { init(); readdata(); work(); return 0; }
相关文章推荐
- IOS 图片上传处理 图片压缩 图片处理
- 四件在我步入职业软件开发生涯那天起就该知道的事情
- Java上传、下载代码
- mysql启动服务时 报错
- JavaScript-2
- 嵌入式bootloader开发之七---裸机watchdog中断开发(Tiny 6410)
- 面向对象语言三大特征
- NetBeans更改默认JDK路径
- 2013.11.05
- VC++连接SQL Server2005 数据库
- Android之Inflate()方法用途+setContentView和inflate区别
- MongoDB 单机
- linux 下6款 git 图形客户端
- Git图形用户工具介绍及比较
- linux cat命令
- 开源镜像站
- SpringMVC和Struts的区别
- svn - 冲突及解决方案
- ios 证书相关
- Android终端配置isatap隧道使用IPV6的方法