LUGOU P3374 【模板】树状数组 1(CDQ 分治)
拿个二维偏序练练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 分治)的更多相关文章
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
- [模板] 树状数组 (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 ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- POJ2299逆序对模板(树状数组)
题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...
- POJ1195Mobile phones (从二维树状数组到cdq分治)
Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...
- BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治
BZOJ 2738 "矩阵乘法"(子矩阵第k大) 题意 给出一个矩阵,多次询问子矩阵中第k大的数是多少. 题解 我做这道题之前先照着这道题出了一道题,是这道题的一维版本,在这里:h ...
随机推荐
- pycharm中使用配置好的virtualenv环境,自动生成和安装requirements.txt依赖
1.手动建立: 第一步 建立虚拟环境 Windows cmd: pip install virtualenv 创建虚拟环境目录 env 激活虚拟环境 C:\Python27\Scripts\env\S ...
- Windows便筏快捷键
Ctrl + L:左对齐 Ctrl + E:居中对齐 Ctrl + R:右对齐 Ctrl + B:加粗 Ctrl + I:斜体 Ctrl + U:给文字添加下划线 Ctrl + T: 给文字添加删除线 ...
- 在VC中使用WebBrowser控件的两方法
ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->Form a Type Library->C:/winnt/syste ...
- 软件-开发软件:Android Studio
ylbtech-软件-开发软件:Android Studio Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT, ...
- 同步+TASK异步请求
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- day3:python运算符及数据类型(str)(int)
运算符 算数运算 :a = 10 * 10赋值运算:a = a + 1 a+=1 比较运算:a = 1 > 5 逻辑运算: a = 1>6 or 1==1 a = 1 and b = ...
- POJ 2954 /// 皮克定理+叉积求三角形面积
题目大意: 给定三角形的三点坐标 判断在其内部包含多少个整点 题解及讲解 皮克定理 多边形面积s = 其内部整点in + 其边上整点li / 2 - 1 那么求内部整点就是 in = s + 1 - ...
- neo4j中cypher语句多个模糊查询
总结一下经验: neo4j中,cypher语句的模糊查询,好像是个正则表达式结构. 对于一个属性的多个模糊查询,可以使用如下写法: 比如,查询N类型中,属性attr包含'a1'或者'a2'的所有节点. ...
- springcloud Finchley 版本hystrix 和 hystrix Dashboard
hystrix的断路功能 引用上个项目,创建新的model ,cloud-hystrix pom.xml <?xml version="1.0" encoding=" ...
- 自定义Jquery:ajax,get,post方法
var myAjax = { request: function(url, type, data, callback) { $.ajax(url, { type: type, data: data, ...