树状数组模板题,用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. for...of 与 for...in 区别

    一.for...of 1.定义 for...of 语句遍历可迭代对象(包括数组.Set 和 Map 结构.arguments 对象.DOM NodeList 对象.字符串等). 2.语法 for (v ...

  2. CentOS7保留默认Python版本并安装更新Python2和Python3共存

    CentOS 7 默认的python版本是python2.7.5.因为yum依赖于默认的python版本的缘由,所以要先保留默认版本,并修改yum文件头部后,才能开始安装更新python2和pytho ...

  3. 使用Docker创建Elasticsearch服务

    一.Docker是什么? Docker是一个开源工具,能将一个WEB应用封装在一个轻量级,便携且独立的容器里,然后可以运行在几乎任何服务环境下.Docker的容器能使应用跑在任何服务器上并且表现一致. ...

  4. MyBatis动态代理查询出错

     org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache. ...

  5. 转!!配置Tomcat时server.xml和content.xml自动还原问题

    原博文地址:http://www.cnblogs.com/zuosl/p/4342190.html 当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content ...

  6. 手动拼写出来的sp_who结果集

    SELECT SPID = er.session_id  ,STATUS = ses.STATUS  ,[Login] = ses.login_name  ,Host = ses.host_name  ...

  7. Notice公告

    把网页放大到125%食用效果更佳 考试题目的密码是ftp的密码 博猪很菜,菜得抠脚,如果写的有什么问题可以在评论区指出:-) 博猪qq:1755833514

  8. django博客项目1.环境搭建

    安装 Python Windows 下安装 Python 非常简单,去 Python 官方网站找到 Python 3 的下载地址,根据你的系统选择 32 位或者 64 位的安装包,下载好后双击安装即可 ...

  9. 【我的Android进阶之旅】如何在浏览器上使用Octotree插件树形地展示Github项目代码?

    前言 最近有个同事看到我打开Github项目时,浏览器上的展示效果是树形的,于是他问我这个是什么浏览器插件,我告诉他是Octotree插件.现在我就来介绍介绍这款Octotree插件. 效果对比 1. ...

  10. jdk1.7 ArrayList源码浅析

    参考:http://www.cnblogs.com/xrq730/p/4989451.html(借鉴的有点多,哈哈) 首先介绍ArrayList的特性: 1.允许元素为空.允许重复元素 2.有序,即插 ...