题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2141

分块加树状数组。

离散化之后,每一个块建一个树状数组。交换x,y,与x左边的数和y右边的数无关,只需处理>x,<y的数。

话说还可以用树套树来写,不过常数太大,比分块加树状数组慢。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define inf 1<<30
#define maxn 20005
using namespace std;
int n,m,nn,tot,ans,a[maxn],t[][maxn];
struct fuck{int x,id;}c[maxn];
int read(){
int x=,f=; char ch;
for(ch=getchar();ch<''||ch>'';ch=getchar()) if(ch=='-') f=-;
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
return x*f;
}
bool comp(fuck a,fuck b){return a.x<b.x;}
int p(int x){return (x-)/nn+;}
void change(int f,int x,int y){for(int i=x;i<=tot;i+=i&-i) t[f][i]+=y;}
int query(int f,int x){int y=;for(int i=x;i;i-=i&-i) y+=t[f][i];return y;}
int main(){
n=read(); nn=sqrt(n);
for(int i=;i<=n;i++) c[i].x=read(),c[i].id=i;
sort(c+,c+n+,comp);
for(int i=;i<=n;i++){
if(c[i].x!=c[i-].x) ++tot;
a[c[i].id]=tot;
}
for(int i=n;i;i--){
ans+=query(,a[i]-);
change(,a[i],);
}
printf("%d\n",ans);
for(int i=;i<=n;i++) change(p(i),a[i],);
m=read();
int x,y;
while(m--){
x=read(); y=read(); if(x>y) swap(x,y);
for(int i=p(x)+;i<p(y);i++){
ans-=query(i,a[x]-); ans+=query(i,tot)-query(i,a[x]);
ans-=query(i,tot)-query(i,a[y]); ans+=query(i,a[y]-);
}
for(int i=x+;p(i)==p(x)&&i<y;i++){
if(a[i]<a[x]) ans--; if(a[i]>a[x]) ans++;
if(a[i]<a[y]) ans++; if(a[i]>a[y]) ans--;
}
if(p(x)!=p(y))
for(int i=y-;p(i)==p(y);i--){
if(a[i]<a[x]) ans--; if(a[i]>a[x]) ans++;
if(a[i]<a[y]) ans++; if(a[i]>a[y]) ans--;
}
if(a[x]<a[y]) ans++; if(a[x]>a[y]) ans--;
change(p(x),a[x],-); change(p(x),a[y],);
change(p(y),a[y],-); change(p(y),a[x],);
swap(a[x],a[y]);
printf("%d\n",ans);
}
return ;
}

BZOJ2141: 排队的更多相关文章

  1. BZOJ2141 排队 树状数组 分块

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2141.html 题目传送门 - BZOJ2141 题意 给定一个序列 $a$ ,先输出原先的逆序对数. ...

  2. bzoj2141排队(辣鸡但是好写的方法)

    题意很明确,也非常经典: 一个支持查询 区间中比k大的数的个数 并且支持单点修改的序列 ——因为题意可以转化为:查询这两个数中比后者大的个数.比后者小的个数.比前者大的个数.比前者小的个数(根据这4个 ...

  3. bzoj2141排队

    /* 动态求逆序对,可以树套树来写, 将交换操作理解成插入和删除比较好理解, 里层是个区间求和的线段树就好了 或者叫 带修主席树? */ #include<cstdio> #include ...

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

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

  5. bzoj2141: 排队(分块+树状数组)

    块套树为什么会这么快.. 先跑出原序列逆序对. 显然交换两个位置$l,r$,对$[1,l),(r,n]$里的数没有影响,所以只需要考虑$[l,r]$内的数. 设$(l,r)$内的数$a_i$,则按以下 ...

  6. BZOJ2141:排队(分块,树状数组)

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

  7. 【分块】【树套树】bzoj2141 排队

    考虑暴力更新的情况,设swap的是L,R位置的数.swap之后的逆序对数应该等于:之前的逆序对数+[L+1,R-1]中比 L位置的数 大的数的个数-[L+1,R-1]中比 L位置的数 小的数的个数-[ ...

  8. [bzoj2141][排队] (分块大法好)

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

  9. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...

随机推荐

  1. 最简单的jdbc操作

    Connection con = null; Statement stmt = null; // 保存到表中 String sql = "insert into website(userna ...

  2. [MFC美化] SkinSharp使用详解2-SkinH.h函数介绍

    SkinSharp功能强大,该皮肤库支持完全多种颜色改变等. 下面是静态链接库时的SkinH.h头文件: /*在Stdafx.h文件中加入如下语句 #include "SkinH.h&quo ...

  3. C#中(int)a和Convert.ToInt32(a)的区别

    首先,在 C# 中,int 其实就是 System.Int32,即都是32位的. 其次,(int) 和 Convert.ToInt32 是两个不同的概念,前者是类型转换,而后者则是内容转换,它们并不总 ...

  4. Exchange 2010 实用小技巧

    #Exchange安装必须开启防火墙服务 #批量建用户: for /f  "tokens=1,2,3,4,5,6,7 delims=," %a in (c:\users.csv) ...

  5. for循环执行步骤

    for循环的具体步骤: for(var i=0;i<5;i++){ alert(1); } 第一步--->初始化i(初始化只在for循环中执行一次); 第二步--->执行条件i< ...

  6. ORACLE 使用sqluldr2和sqlldr进行导入导出

    oracle数据导出工具sqluldr2可以将数据以csv.txt等格式导出,适用于大批量数据的导出,导出速度非常快.导出后可以使用oracle loader工具将数据导入. 简介: Sqluldr2 ...

  7. jmeter之jtl文件解析

    我们知道命令行的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果, <httpSample t="1" lt="1" ts=& ...

  8. liunx环境C、C++代码编译链接中间代码主要流程

    一个比较小的问题,可以直接看帖子: http://blog.csdn.net/gengyichao/article/details/6544266

  9. JDK各版本新增的主要特性

    JDK1.5新特性: 1.自动装箱与拆箱: 2.枚举 3.静态导入,如:import staticjava.lang.System.out 4.可变参数(Varargs) 5.内省(Introspec ...

  10. jsp:useBean的使用

    ->Bean的基本要素: 1.必须要有一个不带参数的构造器,在jsp元素创建Bean时会调用空构造器 2.Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,通过setter/ ...