传送门

拿个二维偏序练练cdq板子,其实就和归并排序差不多,复杂度不太会,似乎nlogn?。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib> using namespace std;
const int MAXN = ;
const int MAXQ = MAXN*;
typedef long long LL; inline LL rd(){
LL x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int n,m,cnt,num;
LL ans[MAXN]; struct Query{
int type,id;LL val;
friend bool operator<(const Query A,const Query B){
return A.id==B.id?A.type<B.type:A.id<B.id;
}
}q[MAXQ],tmp[MAXQ]; void cdq(int l,int r){
if(l==r) return;
int mid=l+r>>;cdq(l,mid),cdq(mid+,r);
int L=l,R=mid+;LL sum=;int o=;
while(L<=mid && R<=r){
if(q[L]<q[R]){
if(q[L].type==) sum+=q[L].val;
tmp[++o]=q[L++];
}
else{
if(q[R].type==) ans[q[R].val]-=sum;
else if(q[R].type==) ans[q[R].val]+=sum;
tmp[++o]=q[R++];
}
}
while(L<=mid) tmp[++o]=q[L++];
while(R<=r) {
if(q[R].type==) ans[q[R].val]-=sum;
else if(q[R].type==) ans[q[R].val]+=sum;
tmp[++o]=q[R++];
}
for(int i=;i<=o;i++) q[i+l-]=tmp[i];
} int main(){
n=rd(),m=rd();
for(int i=;i<=n;i++)
q[++cnt].id=i,q[cnt].type=,q[cnt].val=rd();
for(int i=;i<=m;i++){
q[++cnt].type=rd();
if(q[cnt].type==) q[cnt].id=rd(),q[cnt].val=rd();
else{
q[cnt].id=rd()-;q[cnt].val=++num;
q[++cnt].type=;q[cnt].id=rd();q[cnt].val=num;
}
}
// cout<<" "<<endl;
// for(int i=1;i<=cnt;i++) {
// cout<<q[i].type<<" "<<q[i].id<<" "<<q[i].val<<endl;
// }
cdq(,cnt);
for(int i=;i<=num;i++) printf("%lld\n",ans[i]);
return ;
}

LUGOU P3374 【模板】树状数组 1(CDQ 分治)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. POJ1195Mobile phones (从二维树状数组到cdq分治)

    Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...

  9. BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治

    BZOJ 2738 "矩阵乘法"(子矩阵第k大) 题意 给出一个矩阵,多次询问子矩阵中第k大的数是多少. 题解 我做这道题之前先照着这道题出了一道题,是这道题的一维版本,在这里:h ...

随机推荐

  1. duilib教程之duilib入门简明教程14.部分bug 2

    上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃      如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_t ...

  2. P1977 出租车拼车

    P1977 出租车拼车 题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆 ...

  3. laravel装饰者模式例子

    interface Decorator{ public function display(); } class XiaoFang implements Decorator { private $nam ...

  4. linux环境变量设置错误后的恢复方法(转)

    原文: http://blog.csdn.net/hoholook/article/details/2793447 linux环境变量设置错误后的恢复方法 中国自学编程网收集整理  发布日期:2008 ...

  5. 14. TIM of STM32F103ZE

    block diagram 14.3.1 Time-base unit 有三个基础的寄存器: 计数寄存器(TIMx_CNT) 预分配寄存器(TIMx_PSC), 自动重载寄存器(TIMx_ARR) 重 ...

  6. typedef void (*funcptr)(void) typedef void (*PFV)(); typedef int32_t (*PFI)();

    看到以下代码,不明白查了一下: /** Pointer to Function returning Void (any number of parameters) */ typedef void (* ...

  7. Storm 测试

    本文将学习如何使用java创建Storm拓扑 Storm集群的组件 Storm集群类似于Hadoop集群,只不过 Hadoop 上运行"MapReduce jobs", Storm ...

  8. js比较常用的

    1. <a href="javascript:void(0);" id="div1_bu" >点击链接可以删除div2</a> 超链接的 ...

  9. scrapy爬虫框架爬取招聘网站

    目录结构 BossFace.py文件中代码: # -*- coding: utf-8 -*-import scrapyfrom ..items import BossfaceItemimport js ...

  10. 获取m,n之间的随机整数

    获取m,n之间的随机整数 代码去下: