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

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

优秀的 zkw 线段树讲解:


存一份模板代码(区间修改、区间查询):

/* zkw Segment Tree * Au: GG */#include 
typedef long long ll;const int N=1e5+3;int n, m, zkw; ll t[N<<2], laz[N<<2];inline void update(int x, int y, ll val) { ll l=0, r=0, f=1; for (x+=zkw-1, y+=zkw+1; x^y^1; x>>=1, y>>=1, f<<=1) { t[x]+=val*l, t[y]+=val*r; if (~x&1) laz[x^1]+=val, t[x^1]+=val*f, l+=f; if (y&1) laz[y^1]+=val, t[y^1]+=val*f, r+=f; } for (; x; x>>=1, y>>=1) t[x]+=val*l, t[y]+=val*r;}inline ll query(int x, int y) { ll res=0, l=0, r=0, f=1; for (x+=zkw-1, y+=zkw+1; x^y^1; x>>=1, y>>=1, f<<=1) { if (laz[x]) res+=laz[x]*l; if (laz[y]) res+=laz[y]*r; if (~x&1) res+=t[x^1], l+=f; if (y&1) res+=t[y^1], r+=f; } for (; x; x>>=1, y>>=1) res+=laz[x]*l, res+=laz[y]*r; return res;}int main() { scanf("%d%d", &n, &m); for (zkw=1; zkw<=n+1; zkw<<=1); for (int i=zkw+1; i<=zkw+n; i++) scanf("%lld", t+i); for (int i=zkw-1; i>0; --i) t[i]=t[i<<1]+t[i<<1|1]; while (m--) { int opt, a, b; ll c; scanf("%d%d%d", &opt, &a, &b); if (opt<2) scanf("%lld", &c), update(a, b, c); else printf("%lld\n", query(a, b)); } return 0;}

转载于:https://www.cnblogs.com/greyqz/p/9548634.html

你可能感兴趣的文章
R语言推特twitter转发可视化分析
查看>>
转:Android View.post(Runnable )
查看>>
ChinaTest第二天
查看>>
CSS中position的absolute和relative的应用
查看>>
C#和C++的区别
查看>>
推荐几个我日常使用的IT在线测试工具
查看>>
关于完成端口IOCP异步接收连接函数AcceptEx注意事项 (转)
查看>>
How to use epoll? A complete example in C
查看>>
JScriptHelper类
查看>>
“万能数据库查询分析器”中英文4.02版本 2013-4-3日已在国内几大软件下载网站发布,敬请使用...
查看>>
SSH无密码验证登录的实现(转摘)
查看>>
C# 修饰符的总结 default public private protected internal protectedinternal
查看>>
薛定谔之猫_百度百科
查看>>
jason数据格式详解
查看>>
让IE支持CSS 3圆角属性的方法(转)
查看>>
Java泛型详解
查看>>
linux和windows文件名称长度限制
查看>>
python使用psutil获取服务器信息
查看>>
ArrayList与List对象用法与区别
查看>>
C++ 排序函数 sort(),qsort()的使用方法
查看>>