【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;
}
【bzoj3744】Gty的妹子序列 分块+树状数组+主席树的更多相关文章
- P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...
- zoj2112 树状数组+主席树 区间动第k大
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- BZOJ_2120_数颜色_Set+树状数组+主席树
BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】
题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...
- ZOJ 2112 Dynamic Rankings(树状数组+主席树)
题意 \(n\) 个数,\(m\) 个操作,每次操作修改某个数,或者询问某个区间的第 \(K\) 小值. \(1 \leq n \leq 50000\) \(1 \leq m \leq 10000\) ...
随机推荐
- LibreOJ #100. 矩阵乘法
内存限制:256 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名 模版 以前一直不过样例原来是读入优化没写负数.. 屠龙宝刀点击就送 #in ...
- 洛谷 P2663 越越的组队
题目描述 班级要组织一场综合能力竞赛,全班同学(N个,N是偶数)分成两队互相竞争.老师找到了越越并给了越越一张全班同学综合能力测试的成绩,要求他从全班同学中选出一半(他自己也可能被选),并要求这些同学 ...
- ThinkPHP笔记——开启debug调试模式
debug+trace模式可以查看开发过程中TP的错误信息,可以更好地帮助开发者debug.但是debug模式的开启还不是简单的在配置文件中中设置就可以的,经过查资料摸索,找到一种有效的方法. 首先在 ...
- Java中的Static修饰符
static(静态.修饰符):static修饰成员变量时:static修饰成员变量时,那么该成员变量的数据就是一个共享的数据. 静态成员变量的访问方式:方式一: 使用对象进行访问. 对象.属性名 方式 ...
- java基础——快速排序
今天又把以前学的快速排序拿出来回忆一下 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对“6 1 2 7 9 3 ...
- shell脚本,awk在需要的行上打打印空行。
注解: 判断每行中是否包含字母a,包含了,就将$1的值赋值给变量a,然后判断变量a是否存在,存在打印一个空行,在将变量的值使用空变量b赋值,最后在打印输出. 结果就是在包含有字符a的行上打印一个空行.
- 个人对spring的IOC+DI的封装
暂时支持8种基本数据类型,String类型,引用类型,List的注入. 核心代码 package day01; import java.lang.reflect.Field;import java.l ...
- 安装mysqlclient失败
环境:python3.6 sudo apt-get install python3.6-dev sudo apt-get install default-libmysqlclient-dev 参考:h ...
- BZOJ-3679(数位DP)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a,b; int k[20]; ll dp[2 ...
- MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins
MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins 在MySQL中,可以使用批量密钥访问(BKA)连接算法,该算法使用对连接表的索引访问和 ...