zkw好写吗
codeforces果然名不虚传,仔细研读了该篇文章后感觉受益良多!
其实这篇文章探讨的就是zkw,其中的一些写法让我大开眼界,感觉是zkw那篇论文的又一个提升:
- 内存不再是2的幂了,直接就是\(2n\),zkw应该万万没想到吧。
- zkw的PowerPoint下标的处理有点麻烦,左边又要减一,事实上不用这么麻烦。
这里贴两个模板:
单点加,区间求和
题目。
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 50000;
int n;
struct SegmentTree {
int T[MAXN * 2];
void init() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", T + n + i);
for (int i = n - 1; i; i--)
T[i] = T[i << 1] + T[i << 1 ^ 1];
}
void modify(int i, int d) {
i += n - 1;
for (; i; i >>= 1) T[i] += d;
}
int query(int l, int r) {
l += n - 1;
r += n;
int ret = 0;
for (; l < r; l >>= 1, r >>= 1) {
if (l & 1) ret += T[l ++];
if (r & 1) ret += T[-- r];
}
return ret;
}
};
SegmentTree T;
int main() {
int cases;
scanf("%d", &cases);
for (int i = 0; i < cases; i++) {
printf("Case %d:\n", i + 1);
T.init();
while (true) {
char s[16];
int a, b;
scanf("%s", s);
if (s[0] == 'E') break;
scanf("%d%d", &a, &b);
if (s[0] == 'Q') {
printf("%d\n", T.query(a, b));
}
else {
if (s[0] == 'S') b = - b;
T.modify(a, b);
}
}
}
return 0;
}
区间加,区间求和
题目。
这个是我以前一直没弄懂的,现在豁然开朗。
#include <cstdio>
const int MAXN = (int) 1e5;
int n, m, h;
long long t[MAXN * 2];
int d[MAXN];
void apply(int p, int value, int k) {
t[p] += (long long) value * k;
if (p < n) d[p] += value;
}
void push(int p) {
for (int s = h - 1, k = 1 << (h - 1); s; s--, k >>= 1) {
int i = p >> s;
if (d[i]) {
apply(i << 1, d[i], k >> 1);
apply(i << 1 | 1, d[i], k >> 1);
d[i] = 0;
}
}
}
void build(int p) {
p >>= 1;
for (int k = 2; p; p >>= 1, k <<= 1) {
t[p] = t[p << 1] + t[p << 1 | 1] + (long long) d[p] * k;
}
}
void modify(int l, int r, int value) {
l += n, r += n;
push(l);
push(r - 1);
int l0 = l, r0 = r;
for (int k = 1; l < r; l >>= 1, r >>= 1, k <<= 1) {
if (l & 1) apply(l++, value, k);
if (r & 1) apply(--r, value, k);
}
build(l0);
build(r0 - 1);
}
long long query(int l, int r) {
l += n, r += n;
long long res = 0;
push(l);
push(r - 1);
for (; l < r; l >>= 1, r >>= 1) {
if (l & 1) res += t[l++];
if (r & 1) res += t[--r];
}
return res;
}
int main() {
scanf("%d%d", &n, &m);
while (1 << h <= n) h++;
for (int i = 0; i < n; i++)
scanf("%lld", t + n + i);
for (int i = n - 1; i; i--)
t[i] = t[i << 1] + t[i << 1 | 1];
for (int i = 0; i < m; i++) {
char command;
scanf("\n%c", &command);
if (command == 'C') {
int l, r, value;
scanf("%d%d%d", &l, &r, &value);
l--;
modify(l, r, value);
}
else {
int l, r;
scanf("%d%d", &l, &r);
l--;
printf("%lld\n", query(l, r));
}
}
return 0;
}
zkw好写吗的更多相关文章
- zkw线段树——简单易懂好写好调的线段树
0.简介 zkw线段树是一种非递归线段树,与普通线段树不同的是,它是棵标准的满二叉树,所以遍历过程可全程使用位运算,常数一般比线段树小得多. 1.结构/建树 前面说了,zkw线段树是满二叉树,可是原数 ...
- ZKW线段树
简介 zkw线段树虽然是线段树的另一种写法,但是本质上已经和普通的递归版线段树不一样了,是一种介于树状数组和线段树中间的存在,一些功能上的实现比树状数组多,而且比线段树好写且常数小. 普通线段树采用从 ...
- zkw线段树详解
转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...
- 备战NOIP每周写题记录(一)···不间断更新
※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...
- 写在SDOI2016Round1前的To Do List
理性的整理了一下自己的不足. 计算几何啥都不会,字符串类DP毫无练习,数据结构写的不熟,数论推不出式子,网络流建模常建残: 需要达成的任务: 一.网络流: 熟练网络流的板子(之前一直仰慕zkw费用流, ...
- 【POJ3468】【zkw线段树】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- zkw费用流
期末结束,竞赛生活继续开始,先怒刷完寒假作业再说 至于期末考试,数学跪惨,各种哦智障错,还有我初中常用的建系大法居然被自己抛至脑后,看来学的还是不扎实,以后数学要老老实实学.物理被永哥黑了两分,然后很 ...
- [SinGuLaRiTy] ZKW线段树
[SinGuLaRiTy-1007] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 关于ZKW线段树 Zkw线段树是清华大学张昆玮发明非递 ...
- 数据结构3——浅谈zkw线段树
线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...
随机推荐
- c++程序内存泄露检測工具
功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...
- Oracle中NVARCHAR2与VARCHAR2的差别
NVARCHAR2在计算长度时和字符集相关的: 比如数据库是中文字符集时以长度10为例, 1.NVARCHAR2(10)是能够存进去10个汉字的.假设用来存英文也仅仅能存10个字符. 2.而VARCH ...
- (转)openURL的使用方法
view plaincopy to clipboardprint? [[UIApplication sharedApplication] openURL:[NSURL URLWithString:ap ...
- 编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。
package cn.itcast; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public ...
- BZOJ 1012 最大数maxnumber
Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...
- c语言(3)--运算符&表达式&语句
计算机的本职工作是进行一系列的运算,C语言为不同的运算提供了不同的运算符! 1.那些运算符们 .基本运算符 算术运算符:+ - * / % ++ -- 赋值运算符:= 逗号运算符:, 关系运算符:& ...
- 利用反馈字段给帝国cms添加留言板功能(图文教程)
帝国cms的插件中提供信息反馈字段,很多人却不会用.这里谢寒教大家如何来给自己的帝国cms网站添加留言板功能 1.找到添加地址 2.添加字段 3.你可以在字段中添加多种字段类型(有文本域,单行文本框, ...
- Java算法——O(n)查询数列中出现超过半数的元素
主要思想: 相邻元素两两比较,如果相同存入新数组,不同二者都删除.如果 某数出现次数超高n/2,则最后剩下的1元素为所求. public static int findMostElem(final A ...
- 使用mongodb存取lbs数据
1,在mongodb中创建lbs_db数据库,collection名称lbs_info,要使用lbs查询功能,需要对二维数据列建立索引 db.lbs_info.ensureIndex( { locs ...
- 解决https无法缓存的问题
火狐弃用http,转而大力推广https的动作一石激起千层浪,非常多没有安装安全证书的站点使用新版火狐浏览器已经打不开了. 之前我们站点仅仅有涉及须要加密的部分连接为https协议.眼下看来不得不将整 ...