树状数组模板题,用cdq分治做

cdq分治:

分:把l到r分成两个区间操作

治:对每个分出来的区间进行操作

但是cdq分治和一般分治不同的是,一般的分治左右两个区间互不干扰,但是cdq分治处理的是区间之间有影响的

具体到这题上的操作步骤:

1,先把每一位上的值看成修改

2,记录每一位的操作,对于查询操作l到r,分成两段,一段是l-1,val设为-1,一段是r,val设为1,这样处理的时候计算到r时会加上前面1到l-1的权值,那么1到l-1加上-1*权值就能消除影响 了

3,排序第一关键字按x坐标排序,第二关键字按操作的pos排序

4,开始递归求解1到cnt(此时的遍历是从坐标从左到右依次遍历的)

5,对于区间l到r,我们先依次统计不是查询的修改,当查找到查询操作时,该查询的结果加上统计值*当前val(这一步相当于统计所有左侧区间对右侧区间的影响)

6,对两侧区间进行合并(类似与归并排序的操作)

7,递归到l,mid和mid+1,r区间上

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pii pair<int,int>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; struct query{
int x,pos,val,id;
query(){}
query(int X,int POS,int VAL,int ID){
x=X,pos=POS,val=VAL,id=ID;
}
bool operator <(const query& rhs)const{
return x<rhs.x || x==rhs.x&&pos<rhs.pos;
}
}q[N*],te[N*];
int ans[N*],cnt,totans;
void cdq(int l,int r)
{
// puts("******************");
// for(int i=1;i<=cnt;i++)
// printf("%d %d %d %d\n",q[i].x,q[i].pos,q[i].val,q[i].id);
if(l==r)return ;
int mid=(l+r)>>,tot=;
for(int i=l;i<=r;i++)
{
if(!q[i].pos&&q[i].id<=mid)tot+=q[i].val;//计算左侧对右侧的影响
else if(q[i].pos&&q[i].id>mid)ans[q[i].pos]+=q[i].val*tot;
}
int h1=l,h2=mid+;
for(int i=l;i<=r;i++)//归并排序
{
if(q[i].id<=mid)te[h1++]=q[i];
else te[h2++]=q[i];
}
for(int i=l;i<=r;i++)q[i]=te[i];
cdq(l,mid);cdq(mid+,r);//求下一深度
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
cnt=,totans=;
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
++cnt;
q[cnt]=query(i,,x,cnt);
}
for(int i=;i<=m;i++)
{
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==)
{
++cnt;
q[cnt]=query(x,,y,cnt);
}
else
{
++cnt;
q[cnt]=query(x-,++totans,-,cnt);
++cnt;
q[cnt]=query(y,totans,,cnt);
}
}
// for(int i=1;i<=cnt;i++)
// printf("%d %d %d %d\n",q[i].x,q[i].pos,q[i].val,q[i].id);
sort(q+,q++cnt);
// puts("******************");
// for(int i=1;i<=cnt;i++)
// printf("%d %d %d %d\n",q[i].x,q[i].pos,q[i].val,q[i].id);
cdq(,cnt);
for(int i=;i<=totans;i++)
printf("%d\n",ans[i]);
return ;
}
/********************
5 4
1 2 3 4 5
1 2 3
2 2 5
1 5 1
2 3 5
********************/

P3374 【模板】树状数组 1的更多相关文章

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

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

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

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

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

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

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

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

  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. 洛谷P3374 【模板】树状数组 1

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

  9. P3374 【模板】树状数组 1(cdq)

    P3374 [模板]树状数组 1 cdq分治 刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃 cdq好像只能离线的样子 cdq分治(转) 以下是摘录的几句: 在合并的时 ...

  10. P3374 【模板】树状数组 1(单点增减,区间求和)

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

随机推荐

  1. Map,Filter和Reduce

    转自:https://www.aliyun.com/jiaocheng/444967.html?spm=5176.100033.1.13.xms8KG 摘要:Map,Filter和Reduce三个函数 ...

  2. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  3. 聊天软件项目UDP升级版

    import java.net.*; import java.io.*; class UdpSend2 { public static void main(String[] args) throws ...

  4. MAC下配置MAVEN环境变量配置

    MAVEN环境变量的配置: 第一步:在MAVEN的官网下载MAVEN.http://maven.apache.org/download.cgi,我这里下载的是apache-maven-3.39-bin ...

  5. Java集合(1):ArrayList

    Java容器类的用途是“保存对象”,分为两类:Map——存储“键值对”组成的对象:Collection——存储独立元素.Collection又可以分为List和Set两大块.List保持元素的顺序(有 ...

  6. List和Set区别

    1. Set 接口实例存储的是无序的,不重复的数据.List 接口实例存储的是有序的,可以重复的元素. 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有Ha ...

  7. 用python实现一个计算器

    import re def atom_cal(exp): # 计算乘除法 if '*' in exp: a,b = exp.split('*') return str(float(a) * float ...

  8. HDU - 2819 Swap (二分图匹配-匈牙利算法)

    题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...

  9. Mac 一键显示所有隐藏文件 不要那么六好吧

    系统应简洁而有效,对一般用户来说这一点尤为重要.不必要让普通用户知道的信息往往会给他们造成困扰,因而,隐藏掉他们便是个不错的选择,既可以保证系统平稳流畅运行,也可以为用户提供友好界面. 对于开发者而言 ...

  10. Http请求的TCP连接

    我们一直认为,HTTP连接分为长连接和短连接,而我们现在常用的都是HTTP1.1,因此我们用的都是长连接. 这句话其实只对了一半,我们现如今的HTTP协议,大部分都是1.1的,因此我们平时用的基本上都 ...