BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)
静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于等于j的数的个数,$inv[i][j]$表示第i块与第j块之间的逆序对数,递推搞一下就行。查询的时候中间的部分直接查询,两边多出来的部分暴力计算贡献即可。总复杂度$O(n\sqrt nlogn)$
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+,sqrtN=,inf=0x3f3f3f3f;
int a[N],b[N],c[N],n2,in[N],L[sqrtN],R[sqrtN],n,m,sqrtn,nb;
int sum[sqrtN][N],inv[sqrtN][sqrtN];
void add(int u,int x) {for(; u<=n2; u+=u&-u)c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=u&-u)ret+=c[u]; return ret;}
int main() {
scanf("%d",&n),sqrtn=sqrt(n+0.5);
for(int i=; i<=n; ++i)scanf("%d",&a[i]);
for(int i=; i<=n; ++i)b[i-]=a[i];
sort(b,b+n),n2=unique(b,b+n)-b;
for(int i=; i<=n; ++i)a[i]=lower_bound(b,b+n2,a[i])-b+;
for(int i=; i<=n; ++i) {nb=in[i]=i/sqrtn+; if(!L[in[i]])L[in[i]]=i; R[in[i]]=i;}
for(int i=; i<=nb; ++i) {
for(int j=L[i]; j<=R[i]; ++j)sum[i][a[j]]++;
for(int j=; j<=n; ++j)sum[i][j]+=sum[i][j-];
for(int j=; j<=n; ++j)sum[i][j]+=sum[i-][j];
}
for(int i=; i<=nb; ++i) {
for(int j=R[i]; j>=L[i]; --j)inv[i][i]+=get(a[j]-),add(a[j],);
for(int j=R[i]; j>=L[i]; --j)add(a[j],-);
}
for(int i=; i<=nb; ++i)
for(int j=i+; j<=nb; ++j) {
for(int k=L[j]; k<=R[j]; ++k)inv[i][j]+=(R[j-]-L[i]+)-(sum[j-][a[k]]-sum[i-][a[k]]);
inv[i][j]+=inv[i][j-]+inv[j][j];
}
scanf("%d",&m);
for(int ans=; m--;) {
int l,r;
scanf("%d%d",&l,&r),l^=ans,r^=ans,ans=;
if(in[l]==in[r]) {
for(int i=r; i>=l; --i)ans+=get(a[i]-),add(a[i],);
for(int i=r; i>=l; --i)add(a[i],-);
} else {
int lb=in[l]+,rb=in[r]-;
if(lb<=rb) {
ans+=inv[lb][rb];
for(int i=r; i>=L[in[r]]; --i)ans+=(R[rb]-L[lb]+)-(sum[rb][a[i]]-sum[lb-][a[i]]);
for(int i=R[in[l]]; i>=l; --i)ans+=sum[rb][a[i]-]-sum[lb-][a[i]-];
}
for(int i=r; i>=L[in[r]]; --i)ans+=get(a[i]-),add(a[i],);
for(int i=R[in[l]]; i>=l; --i)ans+=get(a[i]-),add(a[i],);
for(int i=r; i>=L[in[r]]; --i)add(a[i],-);
for(int i=R[in[l]]; i>=l; --i)add(a[i],-);
}
printf("%d\n",ans);
}
return ;
}
BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)的更多相关文章
- bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...
- bzoj 3744: Gty的妹子序列 主席树+分块
3744: Gty的妹子序列 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 101 Solved: 34[Submit][Status] Descr ...
- BZOJ 3744 Gty的妹子序列 (分块 + BIT)
3744: Gty的妹子序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1931 Solved: 570[Submit][Status][Dis ...
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
- BZOJ 3744 Gty的妹子序列
Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...
- BZOJ 3744: Gty的妹子序列 [分块]
传送门 题意:询问区间内逆序对数 感觉这种题都成套路题了 两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个 f我直接处理成到元素j,方便一点 用个树状数 ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- BZOJ 3744 Gty的妹子序列 做法集结
我只会O(nnlogn)O(n\sqrt nlogn)O(nnlogn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nnlogn) 搬来 ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
随机推荐
- Docker容器可以使用容器平台管理自动重启实现自修复吗?
容器的自修复功能是经常被吹嘘的.因为容器是衣服,人躺下了,衣服也躺下了,容器平台能够马上发现人躺下了,于是可以迅速将人重新唤醒工作. 而虚拟机是房子,人躺下了,房子还站着.因而虚拟机管理平台不知道里面 ...
- You only look once
计算MAP https://www.zhihu.com/question/53405779 http://tarangshah.com/blog/2018-01-27/what-is-map-unde ...
- HtmlAgilityPach基本使用方法
//过滤html标签 static void InnerText() { HtmlWeb htmlWeb = new HtmlWeb(); HtmlDocument doc = htmlWeb.Loa ...
- 嵌入式--arm
两年前的东西了,整理一下,说不定以后就会用到了. arm对于s3c2440的这个arm的驱动的整理. 其中包括:adc,beeper 蜂鸣器,key 按键,rtc ,timer定时器,UART等的驱动 ...
- java使用poi实现excel表格生成
通过使用poi技术生成Excel,使用反射技术实现自动映射列表的数据. ExportTableUtil.java public class ExportTableUtil { /** * * @Des ...
- 利用python 模块读取csv文件信息
还有一个比较简单的方法 # -*- coding=utf-8 -*- import pandas as pddf = pd.read_csv("20170320094630.csv" ...
- 三十 Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中
1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed是爬虫结束信号 # -*- coding: u ...
- UVALive-4287 Proving Equivalences (有向图的强连通分量)
题目大意:有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导. 题目分析:由已知的推导可以建一张无向图,则问题变成了最少需要增加几条边能使图变成强连通图. ...
- Hibernate入门_增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private ...
- Matlab 一些函数
max(A,[],dim):dim取1或2.dim取1时,该函数和max(A)完全相同:dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值.