Description

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和。红星幼儿园的小朋友们排起了长长地队伍,准备吃果果。不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观。设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:满足ihj的(i,j)数量。幼儿园阿姨每次会选出两个小朋友,交换他们的位置,请你帮忙计算出每次交换后,序列的杂乱程度。为方便幼儿园阿姨统计,在未进行任何交换操作时,你也应该输出该序列的杂乱程度。

Input

第一行为一个正整数n,表示小朋友的数量;第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高;第三行为一个正整数m,表示交换操作的次数;以下m行每行包含两个正整数ai和bi¬,表示交换位置ai与位置bi的小朋友。

Output

输出文件共m行,第i行一个正整数表示交换操作i结束后,序列的杂乱程度。

Sample Input

【样例输入】


Sample Output


【样例说明】
未进行任何操作时,(2,3)满足条件;
操作1结束后,序列为130 140 150,不存在满足ihj的(i,j)对;
操作2结束后,序列为150 140 130,(1,2),(1,3),(2,3)共3对满足条件的(i,j)。
【数据规模和约定】
对于100%的数据,1≤m≤2*103,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。

Solution

分块啊,用块套树状数组,分块处理逆序对

考虑交换,不完整块就暴力枚举更新完整的就用树状数组直接更新

//Kaiba_Seto 20170116
//otz cjkmao
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MaxN 20010
#define MaxBuf 1<<22
#define RG register
#define inline __inline__ __attribute__((always_inline))
#define Blue() (((S == T)&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S == T)) ? 0 : *S++) char B[MaxBuf],*S=B,*T=B; inline void Rin(RG int &x) {
x=;RG int c=Blue(),f=;
for(; c<||c>; c=Blue())
if(c==)f=-;
for(; c>&&c<; c=Blue())
x=(x<<)+(x<<)+c-;
x*=f; } struct Pr{
int fir,sec;
bool operator < (const Pr &other) const {
return fir < other.fir; } }b[MaxN]; int n,m,a[MaxN],block_size,c1[MaxN],c2[][MaxN],ans; inline void exc(RG int &x,RG int &y) {
x^=y;
y^=x;
x^=y; } inline void modify(RG int *C,RG int x,RG int d) {
for(; x<=n; x+=x&(-x))
C[x]+=d; } inline int sum(RG int *C,RG int x) {
RG int res=;
for(; x; x-=x&(-x))
res+=C[x];
return res; } int main() {
Rin(n);
block_size=static_cast<int>(sqrt(n)+1e-);
for(RG int i=; i<=n; i++)
Rin(b[i].fir),b[i].sec=i;
std::sort(b+,b++n);
for(RG int i=; i<=n; i++) {
static int top=;
if(b[i].fir != b[i-].fir)
++top;
a[b[i].sec]=top; }
for(RG int i=n; i; i--)
ans+=sum(c1,a[i]-),modify(c1,a[i],);
for(RG int i=; i<=n; i++)
modify(c2[(i-)/block_size],a[i],);
printf("%d\n",ans);
Rin(m);
while(m--) {
RG int x,y,l,r,i;
Rin(x),Rin(y);
if(x > y)exc(x,y);
l=(x-)/block_size+;
r=(y-)/block_size-;
if(l <= r) {
for(i=l; i<=r; i++)
ans=ans-sum(c2[i],a[x]-)+sum(c2[i],n)-sum(c2[i],a[x])+sum(c2[i],a[y]-)-sum(c2[i],n)+sum(c2[i],a[y]);
for(i=x+; i<=l*block_size; 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++; }
for(i=(r+)*block_size+; 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++; }
}
else {
for(i=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(a[x] < a[y])ans++;
else if(a[x] > a[y])ans--;
printf("%d\n",ans);
modify(c2[(x-)/block_size],a[x],-);
modify(c2[(x-)/block_size],a[y],);
modify(c2[(y-)/block_size],a[x],);
modify(c2[(y-)/block_size],a[y],-);
exc(a[x],a[y]); }
fclose(stdin);
return ; }

orz cjkmao/Mr.cjk.cat

[bzoj2141][排队] (分块大法好)的更多相关文章

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

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

  2. 【bzoj2141】排队 分块+树状数组

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

  3. BZOJ2141 排队 树状数组 分块

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

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

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

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

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

  6. Bzoj 2141: 排队 分块,逆序对,树状数组

    2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1310  Solved: 517[Submit][Status][Discuss] D ...

  7. bzoj 2141 : 排队 分块

    题目链接 2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1169  Solved: 465[Submit][Status][Discu ...

  8. bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队 分块

    1699: [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MB Description 每天,农夫 John ...

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

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

随机推荐

  1. ubuntu16.04 查看系统可用内存

    free -m 查看内存情况    (单位MB) mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存. buffers和cach ...

  2. 4. extjs中form中的frame:true表示什么

    转自:https://blog.csdn.net/qiu512300471/article/details/23737217 设置为true时可以为panel添加背景色.圆角边框等,如下图 下面的是f ...

  3. java笔记线程方式1线程暂停yield

    public static void yield():暂停当前正在执行的线程对象,并执行其他线程. 让多个线程的执行更和谐,但是不能靠它保证一人一次. public class ThreadYield ...

  4. 慕课网6-4 编程练习:jQuery选择器中的过滤器

    6-4 编程练习 结合所学的jQuery过滤器知识,实现如下图所示的隔行换色效果 任务 使用jQuery的.css()方法设置样式,语法css('属性 '属性值') 使用:odd和:even过滤器实现 ...

  5. Linux文件详解

    一.Linux文件类型分:普通文件.目录文件.链接文件.设备文件.管道文件. 1.普通文件:由ls -al显示属性时,第一个属性为 [-],例如 [-rwxrwxrwx].包括: 纯文本文件(ASCI ...

  6. 四种IO模型

    四种 IO 模型:       首先需要明确,IO发生在 用户进程 与 操作系统 之间.可以是客户端IO也可以是服务器端IO. 阻塞IO(blocking IO):     在linux中,默认情况下 ...

  7. 392 Is Subsequence 判断子序列

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列.你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=10 ...

  8. 234 Palindrome Linked List 回文链表

    请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 详见:https://leetcode.com/problems/palindrome-linked- ...

  9. 设计基于HTML5的APP登录功能及安全调用接口的方式

    转自:http://blog.csdn.net/linlzk/article/details/45536065 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而 ...

  10. 预采订单管理接收来源App数据