借这个题学新姿势,这个题需要利用差分才能AC,普通树状树有3个点过不了。

  差分原理(参考题解区大佬):

  一个例子,一组数据 $ a[] = { 1, 5, 4, 2, 3 } $,差分后得到 $ b[] = { 1, 4, -1, -2, 1 } $,其中 $ a_0 = 0, b_i = a_i - a_{i - 1} $,求原数组 $ a_n $ 某个位置 $ i $ 上的值。

  由 $ b_i = a_i - a_{i - 1} \Rightarrow a_i = b_i + a_{i - 1} $,于是

$$ \left. \begin{aligned} a_i &= b_i + a_{i - 1} \\ a_{i - 1} &= b_{i - 1} + a_{i - 2} \\ \vdots \\ a_1 &= b_1 + a_0 \end{aligned} \right \} + $$

  $ \Rightarrow  a_i = b_i + b_{i - 1} + \cdots + b_1 + a_0 $ ,注意到 $ a_0 = 0 $,于是 $ a_i = \sum_{i = 1}^{n} b_i $ 。这样就求出了原数组位置上的值了。

  然后再看看如何更新区间的值呢。

  我们对 a 数组区间 2 ~ 4 每个值进行 +2 操作,得到 $ 1, 7, 6, 4, 3 $,我们对这个数组进行新的差分得到 $ b_n' = { 1 6 -1 -2 -1 } $ ,我们比较新的差分数组 $ b_n' $ 与 $ b_n $,发现只有 $ b_2',b_5' $ 上的值变了,$ b_2' = b_2 + 2, b_5' = b_5 - 2 $,可以验证,在任何区间 $ a[l,...,r] $ 做出 $ +x $ 更新,都有 $ b_l' = b_l + x , b_{r + 1}' = b_{r + 1} - x $ 。并且不论任何数组经过这样操作都有这样的特点,于是就有了代码中的 `dif()` 函数对区间进行更新。这样每次更新只用更新位置 $ b_l, b_{r + 1} $ 上的值,效率提高了许多。

#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define st first
#define nd second
#define rd third
#define rg register
#define FOR(i, a, b) for(int i =(a); i <=(b); ++i)
#define RE(i, n) FOR(i, 1, n)
#define FORD(i, a, b) for(int i = (a); i >= (b); --i)
#define REP(i, n) for(int i = 0;i <(n); ++i)
#define VAR(v, i) __typeof(i) v=(i)
#define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
using namespace std; #define lowbit(x) ((x) & (-x))
const int N = 500010;
int id[N];
void upd(int n, int k, int x)
{
while (k <= n) id[k] += x, k += lowbit(k);
}
void dif(int n, int l, int r, int x)
{
upd(n, l, x);
upd(n, r + 1, -x);
}
int sum(int k)
{
int ans = 0;
while (k > 0) ans += id[k], k -= lowbit(k);
return ans;
}
int org(int k)
{
return sum(k) - sum(k - 1);
}
int ask(int l, int r)
{
return sum(r) - sum(l - 1);
}
int main()
{
int n, m, k, x, opera, l, r, pre;
pre = 0;
cin >> n >> m;
FOR (i, 1, n)
{
cin >> x;
upd(n, i, x - pre); // 差分后更新到树状数组
pre = x;
}
while(m--)
{
cin >> opera;
switch(opera)
{
case 1: cin >> l >> r >> x; dif(n, l, r, x); break;
case 2: cin >> k; cout << sum(k) << endl; break;
}
}
return 0;
}

  

  

P3368 (模板)树状数组2的更多相关文章

  1. [模板] 树状数组 (C++ class)

    闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...

  2. HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...

  3. 【洛谷 p3368】模板-树状数组 2(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...

  4. 【洛谷 p3374】模板-树状数组 1(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...

  5. POJ2299逆序对模板(树状数组)

    题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...

  6. 洛谷.3374.[模板]树状数组1(CDQ分治)

    题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...

  7. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  8. 洛谷P3368 【模板】树状数组 2

    P3368 [模板]树状数组 2 102通过 206提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 如题,已知一个数列,你需要进行下面两 ...

  9. P3368 【模板】树状数组 2(区间增减,单点查询)

    P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表 ...

  10. 模板【洛谷P3368】 【模板】树状数组 2

    P3368 [模板]树状数组 2 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 树状数组区间加,单点查询. code: #include <i ...

随机推荐

  1. 持续集成与自动化部署---代码流水线管理及Jenkins和gitlab集成

    1.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkins构建完成后,开发构建项目需要一项一项点击,比较麻烦.所以出现pipeline名词. 代 ...

  2. GitBook相关使用以及配置笔记

    本地安装 GitBook的安装非常简单.您的系统只需满足这两个要求: NodeJS(推荐使用v4.0.0及以上版本) Windows,Linux,Unix或Mac OS X gitbook-cli 是 ...

  3. Apache Kafka(十)Partitions与Replication Factor 调整准则

    Partitions与Replication Factor调整准则 Partition 数目与Replication Factor是在创建一个topic时非常重要的两个参数,这两个参数的取值会直接影响 ...

  4. myeclipse2017配置tomcat7.0

    具体配置参考这篇博客:https://www.cnblogs.com/alibaba-inc/p/9249135.html 期间可能会碰到这样一个问题,"The server does no ...

  5. 配置yum仓库:yum install 软件

    1.一个重要模板: 进入/etc/yum.repos.d文件夹,新建一个xiaoxu.repo文件,其中xiaoxu可以根据需要来取名. [模板] vim  xiaoxu.repo [rhel]    ...

  6. CentOS6.5-6.9安装 docker

    安装docker yum -y install docker-io 备注:查看内核版本uname -r ;卸载docker版本命令 yum remove docker 更改配置文件 vim /etc/ ...

  7. 5G手机来了,但这些问题让其短期内难以成为“香饽饽”

    在5G手机喊了太长时间后,其终于在近日不断亮相. 此前据中国质量认证中心官网显示,共有8款5G手机获得3C认证--华为4款,一加.中兴.OPPO和vivo各有一款.随着首批5G手机通过3C认证,意味着 ...

  8. command failed: npm install --loglevel error --registry=https://registry.npm 用vue-cli 4.0 新建项目总是报错

    昨天新买的本本,今天布环境,一安装vue-cli发现都4.0+的版本了,没管太多,就开始新建个项目感受哈,一切运行顺利,输入 "vue create app" 的时候,一切貌似进展 ...

  9. 安装k8s出现 Failed to list *api.Node: Get http://192.168.144.131:8080...: dial tcp 192.168.144.131:8080: getsockopt: no route to

    原因是master主机的防火墙没关,导致无法访问主机的8080端口,解决方法暂时关闭主机上的防火墙. * centos6 : service iptables stop * centos7 : sys ...

  10. sql server2008用ip远程连接

    sql server2008用ip远程连接 转载 weixin_34167819 发布于2017-09-14 15:23:00 阅读数 84 收藏 展开 1,2005的外围应用配置器在2008中换了地 ...