P3374 【模板】树状数组 1
树状数组模板题,用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的更多相关文章
- [模板] 树状数组 (C++ class)
闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- 【洛谷 p3374】模板-树状数组 1(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- POJ2299逆序对模板(树状数组)
题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- 洛谷P3374 【模板】树状数组 1
P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...
- P3374 【模板】树状数组 1(cdq)
P3374 [模板]树状数组 1 cdq分治 刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃 cdq好像只能离线的样子 cdq分治(转) 以下是摘录的几句: 在合并的时 ...
- P3374 【模板】树状数组 1(单点增减,区间求和)
P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...
随机推荐
- socketserver模块、MySQL(数据库、数据表的操作)
一.socketserver实现并发 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环. socketserver模块中分两大类:server类(解决链接问题)和request类(解决 ...
- cmd命令行和bat批处理操作windows服务(转载)
一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32srv ...
- 小知识:pyhon的作用域
http://www.cnblogs.com/wupeiqi/p/5649402.html 五句话搞定JavaScript作用域 从JavaScript == pyhon 作用域几乎一致 __ ...
- MySQL 数据类型(Day41)
一.介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的高度,但宽度是可选的. mysql数据类型概览 #1.数字:(默认都是有符号,宽度指的是显示宽度,与存储无关) ...
- 第一个Python程序(Day3)
一 Python 解释器执行Python程序的过程 eg:python3 C:\ test.py 1.启动python解释器 (内存中) 2.将C:\ test.py中的内容从硬盘读入内存 ...
- HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2
题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列.有两种操作:1.将a序列区间[L,R]中的数全部+1:2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整) 分析:对于一个位置i, ...
- json数据结构
JSON即JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合服务器与JavaScript的交互.JSON易于人阅读和编写.同时也易于机器解析和生成.JSON采 ...
- Apache 工作模式配置优化
Apahce 工作模式配置 1.查看当前MPM工作模式 /usr/local/apache2/bin/apachectl -V Server version: Apache/2.4.27 (Unix) ...
- SElinux 读懂.te 定义自己的 .te【转】
本文转载自:https://blog.csdn.net/kongbaidepao/article/details/61417291 一. .te 文件定义中的一些宏 1.1 unix_socket_c ...
- 【转载】User notification 的实现方法
原帖请看:http://cocoathings.blogspot.com/2013/01/introduction-to-user-notifications-in.html 想要实现如图这样的not ...