P3374 【模板】树状数组 1(cdq)
cdq分治
刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃
cdq好像只能离线的样子
以下是摘录的几句:
- 在合并的时候,我们只处理左区间的修改,只统计右区间的查询
因为左区间的修改一定可以影响右区间的查询
这就体现出了CDQ分治的基本思想了 - 我们把所有操作都记录到了一个数组中,所以数组的大小至少要开到500000*3
过程: 按操作顺序读入--->按位置从小到大归并排序(这样可以保证每个询问操作进行前,都只有位置更前的修改操作被执行)--->(蓝后就没了)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
template <typename T> inline void read(T &x){
char c=getchar(); x=; bool f=;
while(!isdigit(c)) f= !f||c=='-' ? :,c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
x= f? x:-x;
}
int wt[];
template <typename T> inline void output(T x){
if(!x) {putchar(); return;}
if(x<) putchar('-'),x=-x;
int l=;
while(x) wt[++l]=x%,x/=;
while(l) putchar(wt[l--]+);
}
//-----可无视------
struct data{
int id,v,opt; //id:操作所在位,v:视情况而定 opt:操作
bool operator < (const data &tmp) const{
return id<tmp.id||(id==tmp.id&&opt<tmp.opt); //①位置从小到大,②操作先修改后查询
}
}a[],b[]; //注意开3倍
int n,m,cnt,tot,ans[]; //cnt:操作数 tot:询问数
inline void cdq(int l,int r){ //cdq分治(差不多就是归并排序了)
if(l==r) return ;
int mid=l+((r-l)>>);
cdq(l,mid); cdq(mid+,r);
int t1=l,t2=mid+,sum=;
for(int i=l;i<=r;++i){
if((t1<=mid&&a[t1]<a[t2])||t2>r){
if(a[t1].opt==) sum+=a[t1].v;
b[i]=a[t1++];
}else{
if(a[t2].opt==) ans[a[t2].v]-=sum;
else if(a[t2].opt==) ans[a[t2].v]+=sum;
b[i]=a[t2++];
}
}
for(int i=l;i<=r;++i) a[i]=b[i];
}
int main(){
read(n); read(m); int q1,q2;
for(int i=;i<=n;++i) read(a[++cnt].v),a[cnt].id=i,a[cnt].opt=; //把初始序列当成修改操作
for(int i=;i<=m;++i){
read(a[++cnt].opt); read(q1); read(q2);
if(a[cnt].opt==) a[cnt].id=q1,a[cnt].v=q2;
else{ //查询分为2个操作:左端点减前缀和,右端点加前缀和
a[cnt].id=q1-; a[cnt].v=++tot; //左端点操作
a[++cnt].id=q2; a[cnt].v=tot; a[cnt].opt=; //右端点
}
}
cdq(,cnt);
for(int i=;i<=tot;++i) output(ans[i]),putchar('\n');
return ;
}
P3374 【模板】树状数组 1(cdq)的更多相关文章
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- [模板] 树状数组 (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 ...
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- POJ2299逆序对模板(树状数组)
题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...
- LUGOU P3374 【模板】树状数组 1(CDQ 分治)
传送门 拿个二维偏序练练cdq板子,其实就和归并排序差不多,复杂度不太会,似乎nlogn?. #include<iostream> #include<cstdio> #incl ...
- luoguP3374 【模板】树状数组 1 cdq
链接 luogu 思路 可耐我连cdq都不会,Orz 陈丹琦 代码 #include <bits/stdc++.h> using namespace std; const int N = ...
随机推荐
- 《机器学习实践》程序清单3-7 plotTree函数
这个plotTree函数,比较聪明,比较简化,比较抽象,作者一定是逐步优化和简化到这个程度的.我是花了小两天时间,断断续续看明白的,还是在参考了另一篇文章以后.这里是链接http://www.cnbl ...
- 加入到java后台开发
下载java环境安装包 http://www.oracle.com/technetwork/java/javase/overview/index.html 下载eclipse j2ee版本 http: ...
- B-tree indexes
High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko http://d ...
- SET NAMES
High Performance MySQL, Third Editionby Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko Settings ...
- ios -RunTi me(相关知识)
一,推荐两片比较好的介绍RunTime的博文 1>runtime运行时官方文档翻译 2>runtime的学习总结 1.类和对象 2. 成员变量和属性 3.方法与消息 4.Method ...
- MongoDB的"副本“数据库服务器
1.假设1数据库服务器为活跃服务器(主服务器),2和3为备份服务器,当1出现故障的时候,那么会在2和3中推选出一个(根据权重的等规则)作为活跃服务器,而当1又恢复正常了之后呢,它将以备份服务器的身份出 ...
- Shuffle'm Up---poj3087
题目链接 题意:有两个字符串s1,s2:经过交叉问是否得到字符串s,不能输出-1,能就输出交叉的次数 每次重组的串都是s2开始,重新组合时,前面一半是s1,后一半s2: #include<std ...
- li设置float后ul无法包裹li问题解决
解决办法:灰常简单,只需给ul添加样式 ul{ overflow: auto; } 即可
- CentOS7.1.x+Druid 0.12 集群配置
原文转载自:https://blog.csdn.net/bigtree_3721/article/details/79583008 先决条件:安装版本列表 本次安装满足下面的条件: CentOS v7 ...
- 简单mysql常用命令
在命令行 输入 mysql -uroot -p123456 (-u账号 -p密码)登入mysql服务器 1.设置mysql密码set password for 'root'@'localhost' = ...