树状数组模板题,用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. eclipse欺骗了我

    Java源文件(.java)和Java的字节码文件(.class)跟 package 是个什么关系? 平时使用 eclipse 的时候,发现 .java 文件目录必须和 package 包名保持一致, ...

  2. 运行hadoop自带的wordcount例子程序

    1.准备文件 [root@master ~]# cat input.txt hello java hello python hello c hello java hello js hello html ...

  3. (4.17)sql server中的uuid获取与使用

    sql server中的uuid  建表: 1.自增长 studentno int primary key identity(1,1)——bigint也是可以的 2.创建uuidcustomerid  ...

  4. Oracle 11g数据库详解

    常见异常: ORA-14025:不能为实体化视图或实体化视图日志指定PARTITION ORA-14026:PARTITION和CLUSTER子句互相排斥 ORA-14027:仅可以指定一个PARTI ...

  5. C# 调用win api获取chrome浏览器中地址

    //FindWindow 查找窗口 //FindWindowEx查找子窗口 //EnumWindows列举屏幕上的所有顶层窗口,如果回调函数成功则返回非零,失败则返回零 //GetWindowText ...

  6. 吴超老师课程--Hive的介绍和安装

    1.Hive1.1在hadoop生态圈中属于数据仓库的角色.他能够管理hadoop中的数据,同时可以查询hadoop中的数据.  本质上讲,hive是一个SQL解析引擎.Hive可以把SQL查询转换为 ...

  7. Linux基础——系统监控

    系统监视和进程控制工具——top(任务管理器) top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 各行数据大致解释如下: 12: ...

  8. PAT 天梯赛 L1-014. 简单题 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-014 AC代码 #include <iostream> #include <cstdio&g ...

  9. HDU 3966 Aragorn's Story (树链剖分入门题)

    树上路径区间更新,单点查询. 线段树和树状数组都可以用于本题的维护. 线段树: #include<cstdio> #include<iostream> #include< ...

  10. js 三元表达式 复杂写法

    a = 0 b = 0 a === 0 && (a = 1,b = 2) a === 1 ? (a = 3,alert(b)) : (b = 4) a === 1 || alert(a ...