原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2141.html

题目传送门 - BZOJ2141

题意

  给定一个序列 $a$ ,先输出原先的逆序对数。

  然后 $m$ 次操作,每次交换两个数,并输出交换后的逆序对数。

  $1≤m≤2\times 10^3,1≤n≤2\times 10^4,1≤a_i≤10^9$

题解

  离散化。

  分个块。

  对于每一个前缀块和后缀块搞一个树状数组,维护一下每种值的个数的前缀和。

  考虑删除和增加操作,就是修改块内信息和统计块内块外信息。

  统计块内信息直接暴力。

  统计块外信息通过预处理的前缀块和后缀块树状数组来快速搞定。

  可以写一个子程序把四个东西压起来。

  但是我这样的做法需要注意一点:交换的两个数字在同一块内的时候,贡献会被算两遍。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=20005;
int n,m,a[N],Ha[N],hs;
int Lv[45][N],Rv[45][N];
void HASH(){
sort(Ha+1,Ha+n+1);
hs=1;
for (int i=2;i<=n;i++)
if (Ha[i]!=Ha[i-1])
Ha[++hs]=Ha[i];
}
void add(int *c,int x,int d){
for (;x<=hs;x+=x&-x)
c[x]+=d;
}
int sum(int *c,int x){
int ans=0;
for (;x>0;x-=x&-x)
ans+=c[x];
return ans;
}
int Solve0(int *c,int *a,int n){
int ans=0;
for (int i=1;i<=n;i++){
ans+=sum(c,hs)-sum(c,a[i]);
add(c,a[i],1);
}
return ans;
}
int update(int x,int d){
int y=((x-1)>>10)+1,L=((y-1)<<10)+1,R=min(y<<10,n);
int ans=sum(Lv[y],hs)-sum(Lv[y],a[x])+sum(Rv[y],a[x]-1);
for (int i=L;i<x;i++)
if (a[i]>a[x])
ans++;
for (int i=R;i>x;i--)
if (a[i]<a[x])
ans++;
for (int i=1;i<y;i++)
add(Rv[i],a[x],d);
for (int i=y+1;((i-1)<<10)<n;i++)
add(Lv[i],a[x],d);
return ans*d;
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]),Ha[i]=a[i];
HASH();
for (int i=1;i<=n;i++)
a[i]=lower_bound(Ha+1,Ha+hs+1,a[i])-Ha;
int ans=Solve0(Lv[0],a,n);
memset(Lv,0,sizeof Lv);
memset(Rv,0,sizeof Rv);
for (int i=1;((i-1)<<10)<n;i++){
int L=((i-1)<<10)+1,R=min(i<<10,n);
for (int j=1;j<L;j++)
add(Lv[i],a[j],1);
for (int j=n;j>R;j--)
add(Rv[i],a[j],1);
}
scanf("%d",&m);
printf("%d\n",ans);
while (m--){
int x,y;
scanf("%d%d",&x,&y);
if (x>y)
swap(x,y);
ans+=update(x,-1);
ans+=update(y,-1);
if (((x-1)>>10)==((y-1)>>10)){
if (a[x]>a[y])
ans++;
if (a[y]>a[x])
ans--;
}
swap(a[x],a[y]);
ans+=update(x,1);
ans+=update(y,1);
printf("%d\n",ans);
}
return 0;
}

  

BZOJ2141 排队 树状数组 分块的更多相关文章

  1. 【BZOJ2141】排队 树状数组+分块

    [BZOJ2141]排队 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备 ...

  2. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  3. BZOJ_2141_排队_树状数组+分块

    BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...

  4. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  5. bzoj 4765 普通计算姬(树状数组 + 分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4765 很nice的一道题啊(可能是因为卡了n久终于做出来了 题意就是给你一棵带点权的有根树,sum( ...

  6. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树状数组+分块)

    Given a rooted tree ( the root is node 1 ) of N nodes. Initially, each node has zero point. Then, yo ...

  8. Codeforces Round #404 (Div. 2) A,B,C,D,E 暴力,暴力,二分,范德蒙恒等式,树状数组+分块

    题目链接:http://codeforces.com/contest/785 A. Anton and Polyhedrons time limit per test 2 seconds memory ...

  9. gym 100589A queries on the Tree 树状数组 + 分块

    题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...

随机推荐

  1. JAVA中获取键盘输入的方法总结

    Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!下面介绍三种解决方法: 方法一: ...

  2. Vue -- 数据监听

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. JMeter实现唯一参数生成不重复时间戳

    现象: 使用jmeter做接口压测时,总会遇到压测时,提示不允许重复id或提示订单不允许重复现象,那么如何解决呢? 原料工具 jmeter4.0 本地准备好接口服务 思路: 单个接口,小批量接口,一般 ...

  4. 使用PHP Manager for IIS时,Windws 10自带IIS注意事项

    1)开启IIS 10:在“控制面板”的“程序和功能”的“启用或关闭Windows功能”内,勾选(启用)“Internet Information Services”,然后确定,进行安装. 2)若要使用 ...

  5. hbase搭建

    0. 软件版本下载 http://mirror.bit.edu.cn/apache/hbase/   1. 集群环境 Master 172.16.11.97 Slave1 172.16.11.98 S ...

  6. jenkins 安装网址

    https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins

  7. Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950

    原文链接:https://answers.microsoft.com/zh-hans/insider/forum/all/win10-dism%E9%94%99%E8%AF%AF-0x800f0950 ...

  8. SSM框架应用

    一.更新用户密码功能的实现 1. 新建页面 profile.jsp,添加三个输入框和提交按钮:用户输入当前密码.输入新密码.再次确认密码和重置按钮.修改密码按钮: 2. 前台 js(JavaScrip ...

  9. Confluence 6 启用主题评论

    页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...

  10. Java的家庭记账本程序(A)

    日期:2019.2.1 博客期:028 星期五 其实我早就开始开发“家庭记账本”的软件了,只不过写博客写的有点晚,我是打算先做web的!因为Android Studio的教程,还是要对应版本,好多问题 ...