http://www.lydsy.com/JudgeOnline/problem.php?id=3289

题意:……

思路:求交换次数即求逆序对数。确定了这个之后,先离散化数组。然后在后面插入元素的话,就是在区间里面找比它大的元素数量,在前面插入元素的话,就是在区间里面找比它小的元素数量。删除操作类似。因为排序是从小到大排序,所以要找比它大的数量就是区间长度减去小于等于该元素的数量,所以是(R - L + 1 - sum(a[i])),要找比它小的数量就是(sum(a[i] - 1))。然后用莫队算法处理区间询问就好了。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 50010
struct node {
int l, r, id, ans;
} p[N];
int bit[N], a[N], b[N], num[N], ans, kuai, n; bool cmp(const node &a, const node &b) {
if(a.l / kuai == b.l / kuai) return a.r < b.r;
return a.l / kuai < b.l / kuai;
}
bool cmpid(const node &a, const node &b) { return a.id < b.id; }
int lowbit(int x) { return x & (-x); }
void add(int x, int w) { for( ; x <= n; x += lowbit(x)) bit[x] += w; }
int sum(int x) { int ans = ; for( ; x ; x -= lowbit(x)) ans += bit[x]; return ans; } int main() {
while(~scanf("%d", &n)) {
for(int i = ; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
int q; scanf("%d", &q);
for(int i = ; i <= q; i++) scanf("%d%d", &p[i].l, &p[i].r), p[i].id = i; memset(bit, , sizeof(bit));
ans = ; kuai = sqrt(n);
sort(b + , b + + n);
int cnt = unique(b + , b + + n) - b - ;
for(int i = ; i <= n; i++) a[i] = lower_bound(b + , b + + cnt, a[i]) - b; sort(p + , p + + q, cmp);
for(int L = , R = , i = ; i <= q; i++) {
int l = p[i].l, r = p[i].r;
for( ; L < l; L++) { ans -= sum(a[L] - ); add(a[L], -); }
for( ; L > l; L--) { ans += sum(a[L-] - ); add(a[L-], ); }
for( ; R < r; R++) { ans += R - L + - sum(a[R+]); add(a[R+], ); }
for( ; R > r; R--) { ans -= R - L + - sum(a[R]); add(a[R], -); }
p[i].ans = ans;
}
sort(p + , p + + q, cmpid);
for(int i = ; i <= q; i++) printf("%d\n", p[i].ans);
}
return ;
}

BZOJ 3289:Mato的文件管理(莫队算法+树状数组)的更多相关文章

  1. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  2. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

    [BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...

  3. bzoj 3289: Mato的文件管理 莫队+线段树

    题目链接 给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数. 先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的 ...

  4. 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...

  5. 【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r] ...

  6. BZOJ 3289: Mato的文件管理 莫队+BIT

    3289: Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的 ...

  7. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1539  Solved: 665[Submit][Status][Di ...

  8. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  9. bzoj 3289 : Mato的文件管理 (莫队+树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3289 思路: 求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这 ...

随机推荐

  1. x:Static

    用途:访问代码中的变量等 后台定义一个变量 public partial class GetStaticFromBackgroundCode : Window { public static stri ...

  2. WPF 播放音频使用的SoundPlayer和MediaPlayer

    WPF中,最简单最容易播放音频的方式是使用SoundPlayer类.它是.NET Framework 2.0的一部分,是对Win32 PlaySound API的封装. 它具有以下限制: 1)仅支持. ...

  3. 数据绑定(九)Binding的数据校验

    原文:数据绑定(九)Binding的数据校验 Binding用ValidationRules属性来校验数据的有效性,ValidationRules属性类型是Collection<Validati ...

  4. 如何将svg转换为xaml

    原文:如何将svg转换为xaml 1 下载Inkscape 2 用Inkscape打开svg,另存为xaml 注意:复杂的svg图转换完会出现类似下面的xaml,wpf/silverlight是无法解 ...

  5. dotnet core 跨平台编译发布

    vs2017 建立的项目,在项目目录 ,执行 dotnet publish -r ubuntu.15.04-x64 dotnet publish -r linux-x64 dotnet publish ...

  6. shell中select、case的使用

    case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支. select   select结 ...

  7. LCID

    Language Location (or type) Language ID Language tag Supported version Afar   0x1000 aa Release 9 Af ...

  8. 解决C/C++程序执行一闪而过的方法(使用getchar,或者cin.get,不推荐system(“pause”))

    简述 在VS编写控制台程序的时候,包括使用其他IDE(Visual C++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system(“pause”).g ...

  9. C++迭代器 iterator

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  10. getch(),getche(),getchar()的区别

    先说基本区别. (1) getch()和getche()函数     这两个函数都是从键盘上读入一个字符.其调用格式为:      getch();      getche();     两者的区别是 ...