P3374 【模板】树状数组 1

cdq分治

刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃

cdq好像只能离线的样子

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)的更多相关文章

  1. 洛谷.3374.[模板]树状数组1(CDQ分治)

    题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...

  2. [模板] 树状数组 (C++ class)

    闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...

  3. HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...

  4. 【洛谷 p3374】模板-树状数组 1(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...

  5. 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)

    BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...

  6. 【洛谷 p3368】模板-树状数组 2(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...

  7. POJ2299逆序对模板(树状数组)

    题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...

  8. LUGOU P3374 【模板】树状数组 1(CDQ 分治)

    传送门 拿个二维偏序练练cdq板子,其实就和归并排序差不多,复杂度不太会,似乎nlogn?. #include<iostream> #include<cstdio> #incl ...

  9. luoguP3374 【模板】树状数组 1 cdq

    链接 luogu 思路 可耐我连cdq都不会,Orz 陈丹琦 代码 #include <bits/stdc++.h> using namespace std; const int N = ...

随机推荐

  1. win7操作系统说明

    · 能够使用windows7操作系统成为了许多电脑用户的一大喜悦之事,相比之前的Vista系统,windows7系统真的是好看了,快了,好用了,但你是否担心自己的windows7系统就像新安装其他Wi ...

  2. 更改hosts操作

    更改hosts操作: 1.打开文件夹目录:/etc/hosts 2.复制hosts文件 3.修改复制的文件 4.移动并替换到原来的hosts文件 5.鉴定输入密码操作成功 具体修改方案使用: 0.0. ...

  3. complexity_action

    大话数据结构 /* 顺序存储的结构 */ #define MAXSIZE 20 //存储空间初始分配量 typedef int ElemType; //ElemType类型根据实际情况而定,这里假设为 ...

  4. 浏览器指纹 - HTTP cookie 浏览器指纹 欺诈检测 浏览器id hash 浏览器插件信息 canvas 字体信息

    详解浏览器cookie和浏览隐私之间的关系http://www.iefans.net/cookie-yinsi-guanxi/ 详解浏览器cookie和浏览隐私之间的关系 浏览器相关 互联网 2013 ...

  5. flask 日志

    https://www.polarxiong.com/archives/Flask%E4%BD%BF%E7%94%A8%E6%97%A5%E5%BF%97%E8%AE%B0%E5%BD%95%E5%8 ...

  6. 【pyqt5】QdateTimeEdit(日期时间)

    返回当前日期和时间设置 from PyQt5 import QtCore, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): ...

  7. eclipse 64和32位切换

    JAVA_HOME配置的是JAVA_HOME=D:\Java\32\jdk1.6.0_13

  8. 前端 HTML 注释

    单行注释 <!--注释内容--> <!DOCTYPE html> <!-- 页面根节点开始--> <html lang="en"> ...

  9. dedecms如何调用当前栏目的子栏目及子栏目文章

    前面ytkah谈到了 dedecms调用当前栏目的子栏目怎么操作,有的朋友会问如果再增加一个调用子栏目文章的需求,即调用当前栏目的子栏目及子栏目文章,这个有办法实现吗?这时就要涉及到另外两个标签的调用 ...

  10. Pycharm模板添加默认信息

    我们在Pycharm中使用到python3.x版本的解释器,完全没有问题可以正常使用,但是有的时候多少会出现使用python2的时候 我们明明都把代码和文字注释了,为什么使用的时候还会报错呢?? 报错 ...