P3374 【模板】树状数组 1(cdq)
cdq分治
刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃
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)的更多相关文章
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- [模板] 树状数组 (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 ...
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- POJ2299逆序对模板(树状数组)
题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...
- LUGOU P3374 【模板】树状数组 1(CDQ 分治)
传送门 拿个二维偏序练练cdq板子,其实就和归并排序差不多,复杂度不太会,似乎nlogn?. #include<iostream> #include<cstdio> #incl ...
- luoguP3374 【模板】树状数组 1 cdq
链接 luogu 思路 可耐我连cdq都不会,Orz 陈丹琦 代码 #include <bits/stdc++.h> using namespace std; const int N = ...
随机推荐
- CodeForces - 583D Once Again... LIS 循环
题意:给你n个数(n<=100,ai<=300) 一个T,求n重复T次的最长非递减子序列. 题解:我直接考虑4 3 2 1 的例子,当其重复4次时会出现1 2 3 4 的子序列 ,此时再 ...
- 自己实现一个简单的网络音乐mp3播放器
大繁至简,把思路搞清楚才是最重要的,如何去做依托于使用什么来实现这项功能 列出我使用的基本类 NSURLSessionDataTask 数据获取类 NSFileHandle 数据缓存和数据读取类 Au ...
- sql两列相除,保留n位小数
), ) from tablename 以上代码意思两列相处,然后保留4位小数.
- (转)Spring实现IoC的多种方式
原文地址:http://www.cnblogs.com/best/p/5727935.html 目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实 ...
- python 经验:把全局变量放在一个类中
注:红色是我增加的注释 add by zhj:其实python中的import, from-import语句是创建新的同名变量指向引入的模块和模块属性,这也就解释了下面的情况. 我们应尽量不用全局变量 ...
- django源码笔记-【2】(转)
add by zhj: 在原文的基础上有修改 原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371238.html 上一期完理解了WSGI处理 ...
- [py][mx]django form验证-给db减压
django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ...
- [Leetcode] 863. All Nodes Distance K in Binary Tree_ Medium tag: BFS, Amazon
We are given a binary tree (with root node root), a target node, and an integer value `K`. Return a ...
- iOS UI基础-2.0按钮操作与形变
按钮状态 1.normal:默认状态 Default 对应的枚举常量:UIControlStateNormal 2.highlighted(高亮状态) 按钮被按下去的时候(未松开) 对应的枚举常量 ...
- Python线程,进程,携程,I/O同步,异步
只有本人能看懂的-Python线程,进程,携程,I/O同步,异步 举个栗子: 我想get三个url,先用普通的for循环 import requests from multiprocessing im ...