块套树为什么会这么快。。

  先跑出原序列逆序对。

  显然交换两个位置$l,r$,对$[1,l),(r,n]$里的数没有影响,所以只需要考虑$[l,r]$内的数。

  设$(l,r)$内的数$a_i$,则按以下规则更新答案:

  若$a_i<a_l$,则$ans--$

  若$a_i>a_l$,则$ans++$

  若$a_i<a_r$,则$ans++$

  若$a_i>a_r$,则$ans--$

  若$a_l<a_r$,则$ans++$

  若$a_l>a_r$,则$ans--$

  对每一个块建一个树状数组,查询的时候块内用树状数组查,块外暴力就好了。。。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
int n, m, blo, N, ans, l, r, L, R;
int tree[][maxn], bl[maxn], a[maxn], b[maxn], pretree[maxn];
inline void read(int &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-' && (f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
inline void update(int ty, int x, int delta){for(;x<=N;x+=x&-x) tree[ty][x]+=delta;}
inline int query(int ty, int x){int sum=; for(;x;x-=x&-x) sum+=tree[ty][x]; return sum;}
inline int min(int a, int b){return a<b?a:b;}
int main()
{
read(n); blo=sqrt(n);
for(int i=;i<=n;i++) bl[i]=(i-)/blo+;
for(int i=;i<=n;i++) read(a[i]), b[i]=a[i]; N=n;
sort(b+, b++n); N=unique(b+, b++N)-b-;
for(int i=;i<=n;i++) a[i]=lower_bound(b+, b++N, a[i])-b;
for(int i=n;i;i--) ans+=query(, a[i]-), update(, a[i], );
printf("%d\n", ans);
for(int i=;i<=n;i++) update(bl[i], a[i], );
read(m);
for(int i=;i<=m;i++)
{
read(l); read(r); if(l>r) swap(l, r);
int L=l+, R=r-;
if(L<=R)
{
for(int j=L;j<=min(R, bl[L]*blo);j++)
ans+=(a[j]>a[l]), ans-=(a[j]<a[l]), ans+=(a[j]<a[r]), ans-=(a[j]>a[r]);
if(bl[L]!=bl[R]) for(int j=(bl[R]-)*blo+;j<=R;j++)
ans+=(a[j]>a[l]), ans-=(a[j]<a[l]), ans+=(a[j]<a[r]), ans-=(a[j]>a[r]);
for(int j=bl[L]+;j<bl[R];j++)
ans-=query(j, a[l]-), ans+=query(j, N)-query(j, a[l]),
ans-=query(j, N)-query(j, a[r]), ans+=query(j, a[r]-);
}
if(a[l]<a[r]) ans++; else if(a[l]>a[r]) ans--;
if(bl[l]!=bl[r])
update(bl[l], a[l], -), update(bl[l], a[r], ),
update(bl[r], a[r], -), update(bl[r], a[l], );
swap(a[l], a[r]);
printf("%d\n", ans);
}
}

bzoj2141: 排队(分块+树状数组)的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ 3295】动态逆序对 - 分块+树状数组

    题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...

  5. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  6. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  7. BZOJ 2141 排队(分块+树状数组)

    题意 第一行为一个正整数n,表示小朋友的数量:第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高:第三行为一个正整数m,表示交换操作的次数:以下m行每行包含两个正整数 ...

  8. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  9. 【XSY2111】Chef and Churus 分块 树状数组

    题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...

随机推荐

  1. Netty源码分析第2章(NioEventLoop)---->第3节: 初始化线程选择器

    Netty源码分析第二章:NioEventLoop   第三节:初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multi ...

  2. ActiveMQ笔记:管理和监控

    ActiveMQ提供了比较丰富的监控和管理工具.在ActiveMQ的网页里(http://activemq.apache.org/how-can-i-monitor-activemq.html)提到了 ...

  3. Mysql Order By注入总结

    何为order by 注入 本文讨论的内容指可控制的位置在order by子句后,如下order参数可控"select * from goods order by $_GET['order' ...

  4. mysql添加一个字段(

    mysql添加一个字段(在指定的一个字段后面) 举个栗子:alter table inquiry add error_code varchar(3) after add_time; 说明:alter ...

  5. 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题

    博客已迁移至http://zlwis.me. 使用过iscroll.js的上拉下拉刷新效果的朋友应该都碰到过这个问题:在iOS的浏览器中,上拉或下拉刷新时,当手指划出屏幕后,页面无法弹回.很多人因为解 ...

  6. LeetCode 461. Hamming Distance (C++)

    题目: The Hamming distance between two integers is the number of positions at which the corresponding ...

  7. 必应词典手机版(IOS版)与有道词典(IOS版)之问卷分析

    我们制定了一个调查问卷: 1.年龄分布: 2.地域分布: 3.是否用过必应词典? 对于必应词典还是没用过的人数更多. 4.是否用过有道词典? 有道词典的使用率更高一点. 5.对于必应的基本功能给几分? ...

  8. EDK_II环境搭建与测试

    一. 环境准备 Windows 10 (64位)专业版 Visual Studio 2010旗舰版(默认路径安装) Mscrosoft SDKs 7.0A BIOS综合包里的EDK开发环境 二. 实验 ...

  9. C#窗体随机四则运算 (第四次作业)

    ---恢复内容开始--- 增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况:2)用 ...

  10. vim python和golang开发环境配置

    首先在-下新建目录.vim和配置文件.vimrc,.vimrc内容如下: syntax on set nocompatible filetype off set rtp+=~/.vim/bundle/ ...