博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zkw线段树模板练习。
阅读量:5166 次
发布时间:2019-06-13

本文共 1438 字,大约阅读时间需要 4 分钟。

orz今天写了三遍

另外我只写了区间修改和求和。为啥呢?因为我菜啊qwq

#include
#include
#define maxn 200001#define int long longusing namespace std;int n, m;int sum[maxn*2], add[maxn*2]; void build(){ for(m=1; m<=n; m<<=1); for(int i=m+1; i<=m+n; i++) scanf("%lld", &sum[i]); for(int i=m-1; i; i--) sum[i]=sum[i<<1]+sum[i<<1|1];}inline int query_part(int s, int t){ int lc=0, rc=0, len=1, ans=0; for(s+=m-1, t+=m+1; s^t^1; s>>=1, t>>=1, len<<=1){ if(s&1^1) ans+=sum[s^1]+len*add[s^1], lc+=len; if(t&1) ans+=sum[t^1]+len*add[t^1], rc+=len; if(add[s>>1]) ans+=add[s>>1]*lc; if(add[t>>1]) ans+=add[t>>1]*rc; } s>>=1; for(lc+=rc; s; s>>=1) if(add[s]) ans+=add[s]*lc; return ans;}inline int update(int s, int t, int v){ int lc=0, rc=0, len=1; for(s+=m-1, t+=m+1; s^t^1; s>>=1, t>>=1, len<<=1){ if(s&1^1) add[s^1]+=v, lc+=len; if(t&1) add[t^1]+=v, rc+=len; sum[s>>1]+=v*lc, sum[t>>1]+=v*rc; } for(lc+=rc; s; s>>=1) sum[s>>1]+=v*lc;}int q;signed main(){ scanf("%lld%lld", &n, &q); build(); int qwq, x, y, k; while(q--){ scanf("%lld", &qwq); if(qwq==1){ scanf("%lld%lld%lld", &x, &y, &k); update(x, y, k); }else{ scanf("%lld%lld", &x, &y); printf("%lld\n", query_part(x, y)); } } return 0;}

转载于:https://www.cnblogs.com/pushinl/p/9933156.html

你可能感兴趣的文章
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
读《构建之法-软件工程》第四章有感
查看>>
使用 Printf via SWO/SWV 输出调试信息
查看>>
.net 分布式架构之分布式锁实现(转)
查看>>
吴恩达机器学习笔记 —— 3 线性回归回顾
查看>>
Problem E: Automatic Editing
查看>>
SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
查看>>
《DSP using MATLAB》Problem 6.17
查看>>
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
一周TDD小结
查看>>
sizeof与strlen的用法
查看>>
Linux 下常见目录及其功能
查看>>
开源框架中常用的php函数
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>