【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述
输入
输出
对每个询问,单独输出一行,表示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的妹子序列 分块+树状数组+主席树相关推荐
- COGS-257-动态排名系统-树状数组+主席树
描述 给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作: 1.查询A[i],A[i+1],A[i+2],...,A[j](1<=i< ...
- 线。段。树--树状数组-主席树
简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...
- HDU 3333 Turing Tree(树状数组/主席树)
题意 给定一个长度为 \(n\) 的序列,\(m\) 个查询,每次查询区间 \([L,R]\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...
- bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 8144 Solved: 3378 [ ...
- hdu 4417 Super Mario 树状数组||主席树
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)
题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...
- [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)
problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi. 如果到 iii 时,栈顶已经为 pip_ipi ...
- 树状数组(树状数组的基本用法与操作)
什么是树状数组?树状数组简单的来说就是将一个数组模拟树形结构. 树状数组有什么用?树状数组可以将求和的操作从O(n)操作简化为O(logn). 如图所示,横线下方为a数组表示为初试数据:上方为数组c, ...
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
最新文章
- 在pandas数据框中选择多个列
- android发送短信指定收件人,android-发送短信给收件人
- vue之filter用法
- 前后端分离的思考与实践(二)
- IntelliJ IDEA for Mac 如何设置在HTML和XML文件编辑窗口显示浏览器图标
- Vue Bootstrap 静态服务器 实现文件追加上传、断点续传、极速秒传
- linux云存储软件,推荐5个Linux云存储解决方案
- The 15th UESTC Programming Contest Preliminary D - Destr0y City cdoj1558
- 青岛Uber优步司机奖励政策(9月14日~9月20日)
- Linux桌面版横评:一、评测背景
- 详解面试手撕过的那些排序算法
- BAT批处理文件,脚本时间值%time:~0,2%%time:~3,2%%time:~6,2%的用法
- python使用phone实现手机号归属地查询
- 关于二重积分,三重积分的理解
- android 方向键 按钮,这不科学!安卓虚拟按键、实体键谁更好?
- 自定义gerrit提交脚本
- WinCC 7.3 + SQL server(杂)
- 119全国消防日,我们要注意用火安全
- 8 种方案机智应对后端一次性返回 10万 条数据
- 什么是PACS系统? 其特点是什么? PACS系统应该具有哪些功能?