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. js事件的方法

    事件的方法:onclick         鼠标单击ondblclick       鼠标双击onkeyup         按下并释放键盘上的一个键时触发 onchange        文本内容或 ...

  2. 查看mysql数据库及表编码格式

    1.查看数据库编码格式 mysql> show variables like 'character_set_database'; 2.查看数据表的编码格式 mysql> show crea ...

  3. 基于xmpp openfire smack开发之openfire介绍和部署[1]

    前言 http://blog.csdn.net/shimiso/article/details/8816558 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也 ...

  4. XML解析技术研究(一)

      摘要:XML作为过去十年中出现的最流行的技术之一,得到了广泛的应用,而其中XML解析技术是XML应用的关键.本文介绍了XML解析技术的研究动向,分析和比较了4种XML解析技术的优劣,并归纳总结了应 ...

  5. Java设计模式03:常用设计模式之单例模式(创建型模式)

    1.  Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...

  6. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  7. 树形dp练习

    /*poj 1463 最小点覆盖 匈牙利*/ #include<iostream> #include<cstdio> #include<cstring> #defi ...

  8. 文档对象模型操作xml文档

    简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规 ...

  9. CakePHP之Model

    模型 模型在应用程序中是作为业务层而存在的(怎么感觉是数据层......).这就意味着,模型应当负责管理几乎所有涉及数据的事情,其合法性,以及你的业务领域中数据在工作流程中的演化和互动 . 通常模型类 ...

  10. Unity3D GUI之自定义风格组件

    GUI中可以使用一些默认的组件,里面的最后一个参数一般情况下,不设置就是默认的 ,当然也可以进行手动的指定,比如: GUI.Button(new Rect(0,0,100,100),"开始游 ...