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

  先跑出原序列逆序对。

  显然交换两个位置$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. xlutils模块使用

    python常用模块目录 1.xlutils 实现拷贝原文件 原表格: import xlrd from xlutils.copy import copy workbook = xlrd.open_w ...

  2. dirname命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/xiaofei125145/article/details/50620281 示例一 来自手册页的例子 $ dirname ...

  3. [leetcode-921-Minimum Add to Make Parentheses Valid]

    Given a string S of '(' and ')' parentheses, we add the minimum number of parentheses ( '(' or ')', ...

  4. Fourteenth scrum meeting

    闫昊 今日完成:整理上一阶段代码,规划第二阶段实施过程 明日完成:学习讨论区开发 唐彬 今日完成:整理上一阶段代码,规划第二阶段实施过程 明日完成:学习学习进度部分开发 史烨轩 今日完成:整理上一阶段 ...

  5. Alpha阶段展示报告

    一.团队成员简介与个人博客地址 江昊,项目经理 http://www.cnblogs.com/haoj/ 王开,后端开发 http://www.cnblogs.com/wk1216123/ 王春阳,后 ...

  6. OO学习总结与体会

    前言 经过了对于面向对象程序设计的一个月的学习,我初尝了JAVA以及面向对象程序的魅力.经历了三次难度逐渐加大的课后编程作业,我对于工程化面向对象编程以及调试有了深刻的认识与颇多感想.我写下本篇文章以 ...

  7. 在Windows下制作静态库和动态库

    一:静态库的创建 VC++6.0中new一个的为win32 static library工程,之后有二个选项.根据需求选吧. 具体的类或者函数的添加过程和标准的工程一样,直接创建新的类或者添加新 的. ...

  8. Myeclipse2014 用Maven创建第一个web项目(1)---helloworld

    一.创建项目 1.Eclipse中用Maven创建项目 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建一个包,不写也可 ...

  9. 小学四则运算结对项目报告【GUI】

    写在前面 这次的结对项目我做了很长时间,感触也很多.在这次项目中我使用了Java GUI作为和用户的交互方式,但是在上Java课的时候我对GUI和事件驱动这里并没有学的多好,可能是当时对编程还没有什么 ...

  10. lintcode-514-栅栏染色

    514-栅栏染色 我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染. 必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案. 注意事项 n和k都是非负整数 样例 n = 3, ...