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"(可修改的区间最值问题)的操作.其 ...
随机推荐
- SQL Server 2008 错误 233 的解决办法
问题一.忘记了登录Microsoft SQL Server 2008 的sa的登录密码 解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,修改 ...
- 笔记 postgresql oid同步
以前学习postgresql的笔记 create table 消耗 OID 如create table my_test_table, 他本身会消耗一个 会在pg_type中插入两条记录_my_test ...
- VC++ 编译过程
一 前言 一开始编译C++代码的时候可能会对编译的错误觉得很难理解,搞不清楚究竟是哪里错了.了解编译过程,能够更好的处理编译错误. 二 名词解释 编译单元:当一个c或cpp文件在编译时,预处理器首先递 ...
- HDU 5226 Tom and matrix(组合数学+Lucas定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226 题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < ...
- poj 1753 Flip Game 高斯消元
题目链接 4*4的格子, 初始为0或1, 每次翻转一个会使它四周的也翻转, 求翻转成全0或全1最少的步数. #include <iostream> #include <vector& ...
- PHP新闻系统开发流程
PHP新闻系统开发流程一.系统总体设计 (一)系统功能描述和功能模块划分 (二)系统流程分析 (三)系统所用文件二.数据库设计 (一)创建数据库 (二)设计表结构三.新闻发布模块开发 (一)新闻首页 ...
- [LeetCode]题解(python):001-Two-Sum
题目来源: https://leetcode.com/problems/two-sum/ 题意分析: 这道题目是输入一个数组和target,要在一个数组中找到两个数字,其和为target,从小到大输出 ...
- 第一个VC++ win32程序 绘制简单图形
创建一个VC++ win32 打开VS 新工程类型中选择Win32----Win32 Project 自己取个名字(假如叫做My1stWin) 一路next 系统会自动生成好最基本的代码 然后我们 ...
- IMP-00008: unrecognized statement in the export file: string的问题分析
分类: Linux 上周需要将oracle10g中的某一个用户下的对象导入到oracle11g中去.用exp在10g的数据库服务器上导出的dump文件,再用imp在11g的数据库服务器上将dump文件 ...
- Hibernate 知识提高
主键生成策略有: UUID,increment.Hilo.assigned:对数据库无依赖 identity:依赖Mysql或sql server,主键值不由hibernate维护 sequence: ...