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,分别表示 ...
随机推荐
- centos7 Docker Compose 的安装
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose ...
- tomcat8以上管理页面提示403问题
修改conf/tomcat-users.xml <role rolename="manager"/> <role rolename="manager-g ...
- Calico相关资料链接
部署calico的两个yaml文件: kubectl apply -f http://docs.projectcalico.org/v2.3/getting-started/kubernetes/in ...
- springboot集成shiro和开涛的动态url问题
我出现的问题就是一旦/**=authc不管放到前面还是后面都会把所有的资源全部拦截,css和js都访问不到,只需要把开涛的动态url代码改一下就行了(如上图)
- android学习四---Activity和Intent
1.android项目资源深入了解 在深入学习android之前,先好好玩玩手机上的应用,大部分程序都有一个图标,点开图标,程序启动,一定时间后,程序会跳转到第一个界面,比如手机QQ,点开图标,会跳出 ...
- 词性标注算法之CLAWS算法和VOLSUNGA算法
背景知识 词性标注:将句子中兼类词的词性根据上下文唯一地确定下来. 一.基于规则的词性标注方法 1.原理 利用事先制定好的规则对具有多个词性的词进行消歧,最后保留一个正确的词性. 2.步骤 ①对词性歧 ...
- java调用执行cmd命令
未经允许,禁止转载!!! package practice; import java.io.BufferedReader; import java.io.File; import java.io.IO ...
- GIT学习笔记(4):远程分支
GIT学习笔记(4):远程分支 远程分支 远程分支是什么 远程分支是对远程仓库中的分支的索引.它们是一些无法移动的本地分支:只有在GIT进行网络交互时才会更新.远程分支就是书签,提醒着你上次连接远程仓 ...
- js验证真实姓名
var regName = /^[\u4e00-\u9fa5]{2,4}$/; if (!regName.test(examinee.name)) { wx.showToast({ title: &q ...
- akka框架地址
http://doc.akka.io/docs/akka/2.2.3/AkkaJava.pdf