#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
const int N = (int)1e6 + 5; int n, m;
struct Q{
int type, id;
long long val;
friend bool operator < (Q x, Q y){
return x.id == y.id ? x.type < y.type : x.id < y.id;
}
}q[N], tmp[N];
int qsize;
long long ans[N];
int asize; void cdq(int l, int r){//左闭右开
if(r - l <= 1) return ;//长度为1的区间内部就不会有贡献了
int mid = l + ((r - l) >> 1);
cdq(l, mid); cdq(mid, r);
long long sum = 0;
int i = l, j = mid, tsize = 0;
//合并并计算左区间对右区间贡献
while(i < mid && j < r){
if(q[i] < q[j]){
if(q[i].type == 1) sum += q[i].val;
tmp[++tsize] = q[i++];
}
else {
if(q[j].type == 2) ans[q[j].val] -= sum;
else if(q[j].type == 3) ans[q[j].val] += sum;
tmp[++tsize] = q[j++];
}
}
while(i < mid) tmp[++tsize] = q[i++];
while(j < r){
if(q[j].type == 2) ans[q[j].val] -= sum;
else if(q[j].type == 3) ans[q[j].val] += sum;
tmp[++tsize] = q[j++];
}
for(int i = 1; i <= tsize; ++i) q[l + i - 1] = tmp[i];
} /*
这部分的思路总结 判断是否到边界
下方左右分治
计算左边对右边的贡献
把左右类似归并排序重排 */ int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
++qsize;
q[qsize].id = i, q[qsize].type = 1;
scanf("%lld", &q[qsize].val);
}
for(int i = 1; i <= m; ++i){
scanf("%d", &q[++qsize].type);
if(q[qsize].type == 1){
scanf("%d%lld", &q[qsize].id, &q[qsize].val);
}
else {
int l, r; scanf("%d%d", &l, &r);
++asize;
q[qsize].id = l - 1, q[qsize].val = asize;
q[++qsize].id = r, q[qsize].type = 3, q[qsize].val = asize;
}
}
cdq(1, qsize + 1);
for(int i = 1; i <= asize; ++i) printf("%lld\n", ans[i]);
return 0;
}

【模板】cdq分治代替树状数组(单点修改,区间查询)的更多相关文章

  1. HDU 1166 敌兵布阵 (树状数组 单点修改+区间查询)

    题目链接 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

  2. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

  3. hdu 2642二维树状数组 单点更新区间查询 模板题

    二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...

  4. bzoj 1176 cdq分治套树状数组

    题面: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Inp ...

  5. TZOJ 2725 See you~(二维树状数组单点更新区间查询)

    描述 Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algo ...

  6. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  7. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询

    题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...

  8. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  9. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  10. bzoj 4991 [Usaco2017 Feb]Why Did the Cow Cross the Road III(cdq分治,树状数组)

    题目描述 Farmer John is continuing to ponder the issue of cows crossing the road through his farm, intro ...

随机推荐

  1. Sagheer and Nubian Market CodeForces - 812C (二分)

    On his trip to Luxor and Aswan, Sagheer went to a Nubian market to buy some souvenirs for his friend ...

  2. 记一个JS树结构路径查找

    var a=[ { "id" : "0000", "text" : "R1", "children" ...

  3. p211有界自共轭算子T是实数集合的子集

    对条件 取非   是 ∉谱集合的实数 才对  现在是  入  属于正则点集 他  然后  又说T 的谱是实数 这不矛盾吗 这里根据   必要性    推出 蓝色和红色矛盾    矛盾就是 这是谱点 然 ...

  4. 移动端tap事件,消除300毫秒延迟

    引用这个之前,要讲一下首先我是用了webpack技术,所以你的项目如果没有用到这个的话,最好不要用这个技术,当然想用也可以,改下代码也可以用. 下面的代码直接复制就可以用啦. ( function(e ...

  5. [新三板摘牌]国资企业济南华光光电去年终止拟IPO今年摘牌新三板

    国资企业济南华光光电去年终止拟IPO今年摘牌新三板 http://blog.sina.com.cn/s/blog_e32cfa770102ycku.html http://stock.qlmoney. ...

  6. [转帖]一键获取 所有连接过的wifi 密码

    cmd 一键获取 所有连接过的wifi 密码 转帖来源: http://www.cnblogs.com/hookjoy/p/5537623.html for /f "skip=9 token ...

  7. php分割中文字符串为数组的简单例子

    近日在做东西时,遇到要把中文字符进行逐字分割,试了很多方法,都不行,后来发现了一个超简单的方法: 分割字符串很简单,主要是用到函数preg_match_all.当处理含有中文的字符串时,可以用如下的方 ...

  8. jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...

  9. kibana——es的批量操作

    一·_mget: 1.创建的索引如下: 2.批量查询: #查询两个 GET _mget { "docs":[ { "_index":"testdb&q ...

  10. linux中的set -e 与set -o pipefail

    1.set -e "Exit immediately if a simple command exits with a non-zero status." 在“set -e”之后出 ...