题目描述

我早已习惯你不在身边,
人间四月天 寂寞断了弦。
回望身后蓝天,
跟再见说再见……
某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现
她们排成了一个序列,每个妹子有一个美丽度。
Bakser神犇与他打算研究一下这个妹子序列,于是Bakser神犇问道:"你知道区间
[l,r]中妹子们美丽度的逆序对数吗?"
蒟蒻Autumn只会离线乱搞啊……但是Bakser神犇说道:"强制在线。"
请你帮助一下Autumn吧。
给定一个正整数序列a,对于每次询问,输出al...ar中的逆序对数,强制在线。

输入

第一行包括一个整数n(1<=n<=50000),表示数列a中的元素数。
第二行包括n个整数a1...an(ai>0,保证ai在int内)。
接下来一行包括一个整数m(1<=m<=50000),表示询问的个数。
接下来m行,每行包括2个整数l、r(1<=l<=r<=n),表示询问al...ar中的逆序对数(若ai>aj且i<j,则为一个逆序对)。
l,r要分别异或上一次询问的答案(lastans),最开始时lastans=0。保证涉及的所有数在int内。

输出

对每个询问,单独输出一行,表示al...ar中的逆序对数。

样例输入

4
1 4 2 3
1
2 4

样例输出

2


题解

分块+树状数组+主席树

由于题目强制在线,所以不能离线乱搞了。

正常来说,在线查询区间内比某数大/小的数的个数,使用的数据结构是主席树。

然而这样依然要查询询问区间内每个元素,这样时间复杂度还是不能下降。

我们想到可以使用分块预处理,查询时只查询块外元素,能够使时间复杂度降低。

具体地,设f[i][j]表示从第i块开始,到第j个位置结束的逆序对数。这样枚举每个i,就能够在$O(n\log n)$的时间内预处理。

对于每个查询,找到查询区间内第一个整块,根据f数组得到它到区间右端的逆序对数,这样剩下的就只有区间左端块外元素,使用主席树查询即可。

总时间复杂度为$O((n+m)\sqrt n\log n)$,另外听大爷说本题卡常,所以在预处理时需要使用树状数组。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 100010
using namespace std;
int a[N] , v[N] , sum[250][N] , f[N] , n , ls[N << 4] , rs[N << 4] , si[N << 4] , root[N] , tot;
void update(int x)
{int i;for(i = x ; i <= n ; i += i & -i) f[i] ++ ;
}
int query(int x)
{int i , ans = 0;for(i = x; i ; i -= i & -i) ans += f[i];return ans;
}
void insert(int p , int l , int r , int x , int &y)
{y = ++tot , si[y] = si[x] + 1;if(l == r) return;int mid = (l + r) >> 1;if(p <= mid) rs[y] = rs[x] , insert(p , l , mid , ls[x] , ls[y]);else ls[y] = ls[x] , insert(p , mid + 1 , r , rs[x] , rs[y]);
}
int calc(int p , int l , int r , int x , int y)
{if(l > p) return 0;if(r <= p) return si[y] - si[x];int mid = (l + r) >> 1;return calc(p , l , mid , ls[x] , ls[y]) + calc(p , mid + 1 , r , rs[x] , rs[y]);
}
int main()
{int m , i , j , si , last = 0 , x , y , ans;scanf("%d" , &n) , si = (int)sqrt(n);for(i = 0 ; i < n ; i ++ ) scanf("%d" , &a[i]) , v[i] = a[i];sort(v , v + n);for(i = 0 ; i < n ; i ++ ) a[i] = lower_bound(v , v + n , a[i]) - v , insert(a[i] , 0 , n - 1 , root[i] , root[i + 1]);for(i = 0 ; i <= n / si ; i ++ ){memset(f , 0 , sizeof(f)) , update(n - a[i * si]);for(j = i * si + 1 ; j < n ; j ++ ) sum[i][j] = sum[i][j - 1] + query(n - a[j] - 1) , update(n - a[j]);}scanf("%d" , &m);while(m -- ){scanf("%d%d" , &x , &y) , x = (x ^ last) - 1 , y = (y ^ last) - 1 , ans = 0;if(x / si == y / si)for(i = y - 1 ; i >= x ; i -- )ans += calc(a[i] - 1 , 0 , n - 1 , root[i + 1] , root[y + 1]);else{ans += sum[x / si + 1][y];for(i = (x / si + 1) * si - 1 ; i >= x ; i -- )ans += calc(a[i] - 1 , 0 , n - 1 , root[i + 1] , root[y + 1]);}printf("%d\n" , last = ans);}return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7071469.html

【bzoj3744】Gty的妹子序列 分块+树状数组+主席树相关推荐

  1. COGS-257-动态排名系统-树状数组+主席树

    描述 给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作: 1.查询A[i],A[i+1],A[i+2],...,A[j](1<=i< ...

  2. 线。段。树--树状数组-主席树

    简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...

  3. HDU 3333 Turing Tree(树状数组/主席树)

    题意 给定一个长度为 \(n​\) 的序列,\(m​\) 个查询,每次查询区间 \([L,R]​\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...

  4. bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 8144  Solved: 3378 [ ...

  5. hdu 4417 Super Mario 树状数组||主席树

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  6. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  7. [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)

    problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi​. 如果到 iii 时,栈顶已经为 pip_ipi​ ...

  8. 树状数组(树状数组的基本用法与操作)

    什么是树状数组?树状数组简单的来说就是将一个数组模拟树形结构. 树状数组有什么用?树状数组可以将求和的操作从O(n)操作简化为O(logn). 如图所示,横线下方为a数组表示为初试数据:上方为数组c, ...

  9. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

最新文章

  1. 在pandas数据框中选择多个列
  2. android发送短信指定收件人,android-发送短信给收件人
  3. vue之filter用法
  4. 前后端分离的思考与实践(二)
  5. IntelliJ IDEA for Mac 如何设置在HTML和XML文件编辑窗口显示浏览器图标
  6. Vue Bootstrap 静态服务器 实现文件追加上传、断点续传、极速秒传
  7. linux云存储软件,推荐5个Linux云存储解决方案
  8. The 15th UESTC Programming Contest Preliminary D - Destr0y City cdoj1558
  9. 青岛Uber优步司机奖励政策(9月14日~9月20日)
  10. Linux桌面版横评:一、评测背景
  11. 详解面试手撕过的那些排序算法
  12. BAT批处理文件,脚本时间值%time:~0,2%%time:~3,2%%time:~6,2%的用法
  13. python使用phone实现手机号归属地查询
  14. 关于二重积分,三重积分的理解
  15. android 方向键 按钮,这不科学!安卓虚拟按键、实体键谁更好?
  16. 自定义gerrit提交脚本
  17. WinCC 7.3 + SQL server(杂)
  18. 119全国消防日,我们要注意用火安全
  19. 8 种方案机智应对后端一次性返回 10万 条数据
  20. 什么是PACS系统? 其特点是什么? PACS系统应该具有哪些功能?

热门文章

  1. Vuex 模块化与项目实例 (2.0)
  2. css。元素样式、边框样式
  3. Find a girl friend
  4. html中optgroup 标签用法,分组、只读的且呈树状样式显示
  5. Oracle 12c 安装 Linuxx86_64
  6. oracle 性能优化 07_诊断事件
  7. Semantic-UI的React实现(二):CSS类构造模块 1
  8. HDU-2159 FATE 二维背包
  9. Foundationd和Application Kit的类层次
  10. Lightbox JS v2.0