【BZOJ3744】Gty的妹子序列 分块+树状数组
【BZOJ3744】Gty的妹子序列
Description
Input
Output
对每个询问,单独输出一行,表示al...ar中的逆序对数。
Sample Input
1 4 2 3
1
2 4
Sample Output
题解:网上都说要用可持久化线段树,我偏不用,哼~
我们枚举每个块的左端点i,再枚举i右面的所有j,并用树状数组处理出[i,j]中的逆序对数。这样,对于每个询问[a,b],我们已经知道了[c*block,b]中的逆序对数。
我们不妨在倒着求一遍,枚举每个块的右端点i,再枚举i左边的所有j,并用树状数组处理出[j,i]中的逆序对数。这样,我们用[c*block,b]+[a,d*block]-[c*block,d*block],现在[a,b]中的大部分逆序对已经被我们统计完了,就只剩一个在[a,c*block),一个在(d*block,b]中的逆序对了。直接将一边全都再扔到树状数组里,然后用另一边去查找就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=50010;
int n,m,B,nm,now,ans;
int s[maxn],tim[maxn],s1[240][maxn],s2[240][maxn],v[maxn];
struct node
{
int val,org;
}num[maxn];
bool cmp(node a,node b)
{
return a.val<b.val;
}
void updata(int x)
{
for(int i=x;i<=nm;i+=i&-i)
{
if(tim[i]<now) tim[i]=now,s[i]=0;
s[i]++;
}
}
int query(int x)
{
int i,ret=0;
for(i=x;i;i-=i&-i)
{
if(tim[i]<now) tim[i]=now,s[i]=0;
ret+=s[i];
}
return ret;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i,j,a,b,c,d,pre=-1<<30;
for(i=0;i<n;i++) num[i].val=rd(),num[i].org=i;
sort(num,num+n,cmp);
B=int(sqrt(double(n)));
for(i=0;i<n;i++)
{
if(num[i].val>pre) pre=num[i].val,nm++;
v[num[i].org]=nm;
}
for(i=0;i*B<n;i++)
{
now++,a=i*B;
for(j=a;j<n;j++) s1[i][j]=(j?s1[i][j-1]:0)+j-a-query(v[j]),updata(v[j]);
}
for(i=(n-1)/B;i>=1;i--)
{
now++,b=i*B-1;
for(j=b;j>=0;j--) s2[i][j]=s2[i][j+1]+query(v[j]-1),updata(v[j]);
}
m=rd();
for(i=1;i<=m;i++)
{
a=rd()^ans,b=rd()^ans,a--,b--,ans=0;
if(a>b) swap(a,b);
c=a/B,d=b/B;
if(c==d)
{
now++;
for(j=a;j<=b;j++) ans+=j-a-query(v[j]),updata(v[j]);
printf("%d\n",ans);
continue;
}
ans=s1[c+1][b]-s1[c+1][d*B-1]+s2[d][a],now++;
for(j=d*B;j<=b;j++) updata(v[j]);
for(j=a;j<c*B+B;j++) ans+=query(v[j]-1);
printf("%d\n",ans);
}
return 0;
}
【BZOJ3744】Gty的妹子序列 分块+树状数组的更多相关文章
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
- BZOJ3787:Gty的文艺妹子序列(分块,树状数组)
Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...
- BZOJ 3787: Gty的文艺妹子序列 [分块 树状数组!]
传送门 题意:单点修改,询问区间内逆序对数,强制在线 看到加了!就说明花了不少时间.... 如果和上题一样预处理信息,用$f[i][j]$表示块i到j的逆序对数 强行修改的话,每个修改最多会修改$(\ ...
- BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)
题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...
- BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】
题目分析: 首先这种乱七八糟的题目就分块.然后考虑逆序对的统计. 一是块内的,二是块之间的,三是一个块内一个块外,四是都在块外. 令分块大小为$S$. 块内的容易维护,单次维护时间是$O(S)$. 块 ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
随机推荐
- ASP.net的身份验证方式有哪些?
[转] ASP.net的身份验证方式有哪些?分别是什么原理? Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验 ...
- vertex buffer 数据结构 如何读vb的memory pool
vertex attribute (declaration) vertex stream (memory pool) 这两部分 通过attribute 里面对memory的描述把两部分 vbo ...
- ES6中Set集合(与java里类似)
一.引入背景 Set集合是一种无重复元素的列表,开发者们一般不会逐一读取数组中的元素,也不太可能逐一访问Set集合中的每个元素,通常的做法是检测给定的值在某个集合中是否存在 Map集合内含多组键值对, ...
- hive bucket
转载:https://www.cnblogs.com/end/archive/2013/01/09/2852413.html hive中table可以拆分成partition,table和partit ...
- JStorm的搭建文档
1.下载jstorm的jar包 https://github.com/alibaba/jstorm/releases 2.解压jstorm的包 tar -xvf jstorm-2.4.0.tgz mv ...
- 代码验证C#执行”文件打开关闭操作“耗时
2017-04-19 部门经理习惯用C#做数据清洗,遇到个需要验证的问题,在一个万次左右循环内对文件执行打开关闭操作,比在循环前打开文件.循环后关闭文件耗时多多少. using System; usi ...
- [Angular] Debug Angular apps in production without revealing source maps
Source: https://blog.angularindepth.com/debug-angular-apps-in-production-without-revealing-source-ma ...
- Android 百度地图 简单实现--- 美食搜索
Android 百度地图 简单实现--- 美食 依赖包: 加入 Android 百度依赖包: 1 key: <!-- 开发人员 key --> <meta-dat ...
- DB门面,查询构建器,Eloquent ORM三者的CURD
一.DB门面 1.insert DB::insert('insert into table(`name`) value(?)', ['test']); 2.update DB::update('upd ...
- h5+ 管理设备信息
Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 1.属性 1.1.imei: 设备的国际移动设备身份码, ...