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. RGB颜色值与十六进制颜色码对照表

    颜色码对照表 颜色 英文代码 形象描述 十六进制 RGB LightPink 浅粉红 #FFB6C1 255,182,193 Pink 粉红 #FFC0CB 255,192,203 Crimson 猩 ...

  2. PHP-FPM子进程过少解决办法

    /usr/local/php/var/log/php-fpm.log报一下错误 server reached pm.max_children setting (5), consider raising ...

  3. 为什么JS事件函数里面都有一个参数(ev)?

    因为ev是事件的参数啊!在ev中包含了事件触发时的参数,比如click事件的ev中包含着.e.pageX,e.pageY,keydown事件中包含着ev.keyCode等,在ie中,ev是全局的可以通 ...

  4. linux:进程概念

    Linux进程概念 一.实验介绍1.1 实验内容Linux 中也难免遇到某个程序无响应的情况,可以通过一些命令来帮助我们让系统能够更流畅的运行. 而在此之前,我们需要对进程的基础知识有一定的了解,才能 ...

  5. vue-cli搭建vue项目更新

    vue-cli搭建vue项目更新 更新之前一篇博客错误的地方,在使用vue init webpack xxx 之后并不需要使用npm install 下载依赖包,而是直接根据提示 打开文件夹 再npm ...

  6. 20144306《网络对抗》Web基础

    1  实验内容 Web前端HTML:能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前端javascipt:理解JavaScript ...

  7. 新建虚拟机_XP系统(二)

    准备工作:按照<新建虚拟机_XP系统(一)>中操作步骤创建好虚拟机 1.启动虚拟机进入如下界面.新建分区.选择[6]运行DiskGenius工具 2.选择快速分区.可以自定义 3.新建分区 ...

  8. (3.5)mysql基础深入——mysqld_safe脚本功能及流程

    (3.5)mysql基础深入——mysqld_safe脚本功能及流程 目录 1.mysqld_safe过程总结 2.mysql_safe启动的好处 3.mysqld_safe 参数 4.mysqld_ ...

  9. sql server 备份恢复效率

    sql server 备份恢复效率 如何提高备份的速度呢? 其实这个问题和如何让系统跑的更快是一样的,要想系统跑的更快,无非就是:优化系统,或者就是更好更强大的服务器,特别是更多的cpu.更大的内存. ...

  10. filter push down

    filter push down filter push down :先filter再做join 如果SQL里有where条件,那么数据库引擎会先filter再做join 但是MySQL5.6之前还不 ...