Description

我早已习惯你不在身边,

人间四月天 寂寞断了弦。

回望身后蓝天,

跟再见说再见……

某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现

她们排成了一个序列,每个妹子有一个美丽度。

Bakser神犇与他打算研究一下这个妹子序列,于是Bakser神犇问道:"你知道区间\([l,r]\)中妹子们美丽度的逆序对数吗?"

蒟蒻Autumn只会离线乱搞啊……但是Bakser神犇说道:"强制在线。"

请你帮助一下Autumn吧。

给定一个正整数序列\(a\),对于每次询问,输出\(a_{l}...a_{r}\)中的逆序对数,强制在线。

Input

第一行包括一个整数\(n(1 \le n \le 50000)\),表示数列\(a\)中的元素数。

第二行包括\(n\)个整数\(a_{1}...a_{n}\)(\(a_{i}>0\),保证\(a_{i}\)在\(int\)内)。

接下来一行包括一个整数\(m(1 \le m \le 50000)\),表示询问的个数。

接下来m行,每行包括\(2\)个整数\(l,r(1 \le l \le r \le n)\),表示询问\(a_{l}...a_{r}\)中的逆序

对数(若\(a_{i}>a_{j}\)且\(a_{i}<a_{j}\),则为一个逆序对)。

\(l,r\)要分别异或上一次询问的答案\((lastans)\),最开始时\(lastans=0\)。

保证涉及的所有数在\(int\)内。

Output

对每个询问,单独输出一行,表示\(a_{l}...a_{r}\)中的逆序对数。

Sample Input

4

1 4 2 3

1

2 4

Sample Output

2

一道很典型的分块题目。

首先将序列离散化,之后分块记录这些值:\(have[i][j]\)表示第\(i\)个块中小于等于\(j\)的元素个数;\(rev[i]\)表示第\(i\)个块的逆序对个数;\(ref2[i][j]\)表示\(i\)块与下标小于等于\(j\)的序列元素构成的逆序对数(\(A_{j}\)不在第\(i\)块内);\(ref3[i][j]\)第\(i\)块与前\(j\)块所构成逆序对数目。(预处理在\(O(n\sqrt{n})\)的时间内完成)

询问的话,块与块之间的我们可以用\(ref3\)在\(O(\sqrt{n})\)的时间内算出,块与散部可以用\(ref2\)在\(O(\sqrt{n})\)的时间内算出。散与散的只能用树状数组暴力求解,在\(O(\sqrt{n}logn)\)的时间内算出结果。

综上,本题时间复杂度\(O(n\sqrt{n}+m\sqrt{n}logn)\),空间复杂度\(O(n\sqrt{n})\)。有不理解的参考代码。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std; #define maxn 50010
const int len = 230;
int n,m,ans,A[maxn],bac[maxn],have[len][maxn];
int rev[maxn],tree[maxn],ref2[len][maxn],ref3[len][len],tot; inline int begin(int ord) { return (ord-1)*len+1; }
inline int end(int ord) { return min(ord*len,n); }
inline int belong(int ord) { return (ord+len-1)/len; }
inline int size(int ord) { return end(ord)-begin(ord)+1; } inline int lowbit(int x) { return x & -x; }
inline void ins(int x,int y) { for (;x <= n;x += lowbit(x)) tree[x] += y; }
inline int calc(int x) { int ret = 0; for (;x;x -= lowbit(x)) ret += tree[x]; return ret; } inline void ready()
{
for (int i = 1;i <= n;++i) bac[i] = A[i];
sort(bac+1,bac+n+1); tot = unique(bac+1,bac+n+1)-bac-1;
for (int i = 1;i <= n;++i) A[i] = lower_bound(bac+1,bac+tot+1,A[i])-bac;
tot = (n + len-1)/len;
for (int i = 1;i <= tot;++i)
{
int l = begin(i),r = end(i);
for (int j = l;j <= r;++j) have[i][A[j]]++;
for (int j = 1;j <= n;++j) have[i][j] += have[i][j-1];
for (int j = l;j <= r;++j) for (int k = j+1;k <= r;++k) rev[i] += A[j] > A[k];
}
for (int i = 1;i <= tot;++i)
{
int l = begin(i),r = end(i);
for (int j = 1;j < l;++j)
ref2[i][j] += ref2[i][j-1],ref2[i][j] += have[i][A[j]-1];
for (int j = r+1;j <= n;++j)
ref2[i][j] += ref2[i][j-1],ref2[i][j] += size(i)-have[i][A[j]];
}
for (int i = 1;i <= n;++i)
{
int now = belong(i);
for (int j = 1;j < now;++j)
ref3[now][j] += size(j)-have[j][A[i]];
}
for (int i = 1;i <= tot;++i)
for (int j = 2;j < i;++j)
ref3[i][j] += ref3[i][j-1];
} inline int work(int l,int r)
{
int tot = 0,L = belong(l),R = belong(r),p = end(L),q = begin(R);
for (int i = L+1;i < R;++i)
{
tot += rev[i];
tot += ref3[i][i-1] - ref3[i][L];
tot += ref2[i][p]-ref2[i][l-1];
tot += ref2[i][r]-ref2[i][q-1];
}
if (L != R)
{
for (int i = r;i >= q;--i) tot += calc(A[i]-1),ins(A[i],1);
for (int i = p;i >= l;--i) tot += calc(A[i]-1),ins(A[i],1);
for (int i = r;i >= q;--i) ins(A[i],-1);
for (int i = p;i >= l;--i) ins(A[i],-1);
}
else
{
for (int i = r;i >= l;--i) tot += calc(A[i]-1),ins(A[i],1);
for (int i = r;i >= l;--i) ins(A[i],-1);
}
return tot;
} int main()
{
freopen("3744.in","r",stdin);
freopen("3744.out","w",stdout);
scanf("%d",&n);
for (int i = 1;i <= n;++i) scanf("%d",A+i);
ready();
scanf("%d",&m);
for (int i = 1;i <= m;++i)
{
int l,r; scanf("%d %d",&l,&r);
l ^= ans; r ^= ans;
printf("%d\n",ans = work(l,r));
}
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 3744 Gty的妹子序列的更多相关文章

  1. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

  2. BZOJ 3744 Gty的妹子序列 (分块 + BIT)

    3744: Gty的妹子序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1931  Solved: 570[Submit][Status][Dis ...

  3. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  4. bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块

    题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...

  5. BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

  6. BZOJ 3744: Gty的妹子序列 [分块]

    传送门 题意:询问区间内逆序对数 感觉这种题都成套路题了 两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个 f我直接处理成到元素j,方便一点 用个树状数 ...

  7. BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)

    题目链接 静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于 ...

  8. BZOJ 3744 Gty的妹子序列 做法集结

    我只会O(nnlogn)O(n\sqrt nlogn)O(nn​logn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nn​logn) 搬来 ...

  9. BZOJ 3744 Gty的妹子序列 分块+树状数组

    具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nn​logn) CODE #include <cmath> #include <cctyp ...

随机推荐

  1. jersey构建rest服务返回json数据

    1.  eclipse 创建 dynamic web project 2.  将jersey相关jar包放到libs目录下 3. web.xml 增加 jersey 相关内容 <?xml ver ...

  2. Java语言基础(三)

    Java语言基础(三) 一.    补码 (1).之所以有补码是因为要考虑成本 就是造计算机的成本 (2).下面让我们分析一下补码 以四位补码为例 <1> 高位是符号位,它决定其是正数还是 ...

  3. UITableView的简单应用介绍

    创建一个tableView视图,然后把这个视图界面添加到主界面上. _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 20, [ ...

  4. Fragment的懒加载

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在 ...

  5. C# 各种集合

    大多数集合都在  System.Collections,System.Collections.Generic两个命名空间. 其中System.Collections.Generic专门用于泛型集合. ...

  6. 禁用windows 10自动更新

    按Win键+R键调出运行,输入“gpedit.msc”点击“确定”,调出“本地组策略编辑器”.顺序依次展开计算机配置,管理模板 ,windows组件 ,windows更新 点击右边“配置自动更新”,选 ...

  7. IOS开发网络篇之──ASIHTTPRequest详解

    目录 目录 发起一个同步请求 创建一个异步请求 队列请求 请求队列上下文 ASINetworkQueues, 它的delegate提供更为丰富的功能 取消异步请求 安全的内存回收建议 向服务器端上传数 ...

  8. 判断PHP数组是否为空的代码

    PHP判断数组为空首选方法:count($arr),size($arr); 复制代码 代码如下: $arr= array(""); echo count($arr); echo s ...

  9. maven mirror

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...

  10. IOS DLNA PlatinumKit库的使用

    前段时间进行了IOS DLNA的开发,使用的是PlatinumKit库.网上查了很多资料都未果,经过自己的摸索,遂将如何使用PlatinumKit进行DLNA的开发分享给大家. 1.PlatinumK ...