BZOJ 2141 分块 线段树
思路:
a[i]
//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=20050;
int n,m,cpy[N],h[N],u,Block,block[N],xx,yy,ans;
struct BIT{
int tree[N*4];
void insert(int l,int r,int pos,int X,int f){
if(l==r){tree[pos]+=f;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<X)insert(mid+1,r,rson,X,f);
else insert(l,mid,lson,X,f);
tree[pos]=tree[lson]+tree[rson];
}
int query(int l,int r,int pos,int L,int R){
if(L>R)return 0;
if(l>=L&&r<=R){return tree[pos];}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)return query(mid+1,r,rson,L,R);
else if(mid>=R)return query(l,mid,lson,L,R);
else return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
}
}bit[222];
int main(){
scanf("%d",&n),Block=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&h[i]),cpy[i]=h[i],block[i]=(i-1)/Block+1;
sort(cpy+1,cpy+1+n),u=unique(cpy+1,cpy+1+n)-cpy-1;
for(int i=1;i<=n;i++)h[i]=lower_bound(cpy+1,cpy+1+u,h[i])-cpy;
for(int i=1;i<=n;i++){
bit[0].insert(1,u,1,h[i],1);
ans+=bit[0].query(1,u,1,h[i]+1,u);
bit[block[i]].insert(1,u,1,h[i],1);
}
printf("%d\n",ans);
scanf("%d",&m);
while(m--){
scanf("%d%d",&xx,&yy);
if(xx>yy)swap(xx,yy);
if(block[xx]+1<block[yy]){
for(int i=block[xx]+1;i<block[yy];i++){
ans-=bit[i].query(1,u,1,1,h[xx]-1);
ans+=bit[i].query(1,u,1,h[xx]+1,u);
ans+=bit[i].query(1,u,1,1,h[yy]-1);
ans-=bit[i].query(1,u,1,h[yy]+1,u);
}
int temp=lower_bound(block+1,block+1+n,block[xx]+1)-block;
for(int i=xx+1;i<temp;i++){
if(h[i]<h[xx])ans--;
else if(h[i]>h[xx])ans++;
if(h[i]<h[yy])ans++;
else if(h[i]>h[yy])ans--;
}
temp=lower_bound(block+1,block+1+n,block[yy])-block;
for(int i=temp;i<yy;i++){
if(h[i]<h[xx])ans--;
else if(h[i]>h[xx])ans++;
if(h[i]<h[yy])ans++;
else if(h[i]>h[yy])ans--;
}
}
else{
for(int i=xx+1;i<yy;i++){
if(h[i]<h[xx])ans--;
else if(h[i]>h[xx])ans++;
if(h[i]<h[yy])ans++;
else if(h[i]>h[yy])ans--;
}
}
if(h[xx]<h[yy])ans++;
else if(h[xx]>h[yy])ans--;
bit[block[xx]].insert(1,u,1,h[xx],-1),bit[block[yy]].insert(1,u,1,h[yy],-1);
bit[block[xx]].insert(1,u,1,h[yy],1),bit[block[yy]].insert(1,u,1,h[xx],1);
swap(h[xx],h[yy]);
printf("%d\n",ans);
}
}
BZOJ 2141 分块 线段树的更多相关文章
- BZOJ - 2957 (分块/线段树)
题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大 ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- bzoj 3585 mex - 线段树 - 分块 - 莫队算法
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...
- BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)
显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...
- CDOJ 1157 数列(seq) 分块+线段树
数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Desc ...
- 【BZOJ 3476】 线段树===
59 懒惰的奶牛贝西所在的牧场,散落着 N 堆牧草,其中第 i 堆牧草在 ( Xi,Yi ) 的位置,数量有 Ai 个单位.贝西从家移动到某一堆牧草的时候,只能沿坐标轴朝正北.正东.正西.正南这四个 ...
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...
随机推荐
- 如何上传SNAPSHOT类型的JAR文件到nexus中
在要上传的文件的目录中执行以下命令即可: mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.5.4 ...
- epoll的实现与深入思考
提契 纸上得来终觉浅,绝知此事要躬行. 正文 前段时间写了一篇epoll的学习文章,但没有自己的心得总觉得比较肤浅,花了一些时间补充一个epoll的实例,并浅析一下过程中遇到的问题. 上epoll_s ...
- Sublime Text 3 Build 3047 安装/插件安装/C编程环境配置
Sublime Text 3 Build 3047 安装 参考:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=29 插件 ...
- 功分器 power divider
之前讲过有了解过耦合器,知道耦合器是矢网测量当中的关键设备 coupler //------------------------------------------------------------ ...
- java.util.Date日期类通过java语句转换成Sql(这里测试用的是oracle)语句可直接插入(如:insert into)的日期类型
public void add(Emp emp) throws Exception{ QueryRunner runner = new QueryRunner(JdbcUtil.getDataSour ...
- Scala 技术笔记之 可变长参数
转自 http://www.cnblogs.com/rollenholt/p/4112833.html Scala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表. ...
- python的包装和授权
包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均 ...
- 原生js实现form表单序列化
当我们有form表单而且里面的表单元素较多时,咱们总不能一个个去获取表单元素内的值来进行拼接吧!这样会很让人蛋疼!为了方便与后台交互并且提高自己的开发效率,并且不让你蛋疼:我们一起用原生来写一个表单序 ...
- select的option触发事件
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- NOIP2016 DAY2 T1 组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...