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. NBUTOJ 1643 - 阶乘除法 - [数学题]

    题目链接:https://ac.2333.moe/Problem/view.xhtml?id=1643 问题描述 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*... ...

  2. Gym - 101028I March Rain 二分

    http://codeforces.com/gym/101028/problem/I 题意:给你n个洞,k个布条,问布条能贴到所有洞时的最小值. 题解:二分答案,因为答案越大就越容易满足条件. 技巧: ...

  3. 删除server服务文件

    某用户升级ArcGIS for Server后,出现了之前版本server中的服务残留的现象,且服务访问不正常,怎样彻底删除的残留文件. 即怎样删除ArcGIS for Server中发布的某个服务涉 ...

  4. LightOj 1104 - Birthday Paradox(生日悖论概率)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1104 题意:一年365天,在有23个人的情况下,这23个人中有两个人生日相同的概率是大 ...

  5. C++三大特性之多态

    原文地址:https://qunxinghu.github.io/2016/09/08/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E5%A ...

  6. 2018最新php笔试题及答案(持续更新)

    php中include和require的区别 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容.include 和 require 语句用于在执行流中插入写在其他文件中 ...

  7. (c++) int 转 string,char*,const char*和string的相互转换

    一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...

  8. 解决 libev.so.4()(64bit) is needed by percona-xtrabackup-2.3.4-1.el6.x86_64案例

    在mysql主从同步时经常会用到Xtra, XtraBackup可以说是一个相对完美的免费开源数据备份工具,支持在线无锁表同步复制和可并行高效率的安全备份恢复机制相比mysqldump来说优势较大好处 ...

  9. Unity 脚本的执行顺序

    在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的. Awake ->OnEable-> Start -> FixedUpdate-> Update ...

  10. 网站被XMR恶意挖矿

    发现: 网站首页被恶意更改 网站的关键词和描述被恶意更改 服务器和只要访问此服务器上的网页cup 直线上升100% 排查代码发现js 文件被恶意更改,访问了挖矿网站 操作:删除js 里面的恶意代码,更 ...