离散化,分块。

预处理出:ans[i][j] 第i块到第j块的逆序对数。

f[i][j] 第1~i块中大于j的数的个数。

g[i][j] 第1~j块中小于j的数的个数。

每次询问时对于整块部分可以O(1)获得。

对于零散部分呢?

>在一列数的后面添加一个数,逆序对数会增加 数列中比它大的数的个数。

>在一列数的前面添加一个数,逆序对数会增加 数列中比它小的数的个数。

所以统计以上信息的时候,对于整块的部分,我们可以借由预处理的东西差分来O(1)地获得答案,零散的部分就是树状数组咯。

空间复杂度是O(n*sqrt(n))的。

时间复杂度是O(n*sqrt(n)*log(n))的。

P.S.根本不用卡常数什么的呢。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define N 50001
#define BLOCK_SIZE 250
int sz,sum,n,a[N],l[BLOCK_SIZE],r[BLOCK_SIZE],D[N],f[BLOCK_SIZE][BLOCK_SIZE];
int Less[BLOCK_SIZE][N],More[BLOCK_SIZE][N],b[N],en,m,x,y,num[N],ans;
struct Point{int v,p;}t[N];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int Res,Num;char C,CH[];
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
void add(int p,const int &v) {while(p<=n) {D[p]+=v; p+=(p&(-p));}}
int getsum(int p) {int res=; while(p) {res+=D[p]; p-=(p&(-p));} return res;}
void makeblock()
{
sz=sqrt(n); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
l[sum]=r[sum-]+;
r[sum]=n;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
void LiSan()
{
sort(t+,t+n+); a[t[].p]=++en;
for(int i=;i<=n;i++)
{
if(t[i].v!=t[i-].v) en++;
a[t[i].p]=en;
}
}
void init_each_ans()
{
for(int i=;i<=sum;i++)
{
memset(D,,sizeof(D)); int pos=,res=;
for(int j=i;j<=sum;j++)
{
for(int k=l[j];k<=r[j];k++)
{
pos++;
add(a[k],);
res+=(pos-getsum(a[k]));
}
f[i][j]=res;
}
} memset(D,,sizeof(D));
}
void init_sum()
{
memcpy(b,a,sizeof(b));
for(int i=;i<=sum;i++)
{
sort(b+l[i],b+r[i]+);
memcpy(More[i],More[i-],sizeof(More[i]));
memcpy(Less[i],Less[i-],sizeof(Less[i]));
for(int j=;j<=en;j++)
{
More[i][j]+=(b+r[i]+-upper_bound(b+l[i],b+r[i]+,j));
Less[i][j]+=(lower_bound(b+l[i],b+r[i]+,j)-(b+l[i]));
}
}
}
int getMore(const int &L,const int &R,const int &v){return More[R][v]-More[L-][v];}
int getLess(const int &L,const int &R,const int &v){return Less[R][v]-Less[L-][v];}
int main()
{
n=G();
for(int i=;i<=n;i++)
{
t[i].v=G();
t[i].p=i;
}
LiSan(); makeblock(); init_each_ans(); init_sum();
m=G();
for(int j=;j<=m;j++)
{
x=G(); y=G(); x^=ans; y^=ans;
if(num[x]+>=num[y])
{
int pos=; ans=;
for(int i=x;i<=y;i++)
{
pos++;
add(a[i],);
ans+=(pos-getsum(a[i]));
}
for(int i=x;i<=y;i++) add(a[i],-);
P(ans);
}
else
{
int pos=r[num[x]]-x+; ans=f[num[x]+][num[y]-];
for(int i=r[num[x]];i>=x;i--)
{
ans+=(getLess(num[x]+,num[y]-,a[i])+getsum(a[i]-));
add(a[i],);
}
for(int i=l[num[y]];i<=y;i++)
{
pos++;
add(a[i],);
ans+=(pos-getsum(a[i])+getMore(num[x]+,num[y]-,a[i]));
}
for(int i=x;i<=r[num[x]];i++) add(a[i],-);
for(int i=l[num[y]];i<=y;i++) add(a[i],-);
P(ans);
}
}
return ;
}

【分块】【树状数组】bzoj3744 Gty的妹子序列的更多相关文章

  1. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  2. 【BZOJ 3295】动态逆序对 - 分块+树状数组

    题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...

  3. 【bzoj2141】排队 分块+树状数组

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...

  4. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  5. 【BZOJ3744】Gty的妹子序列 分块+树状数组

    [BZOJ3744]Gty的妹子序列 Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzo ...

  6. BZOJ3744 Gty的妹子序列(分块+树状数组)

    题意 询问区间内逆序对数  强制在线 1<=n<=50000 1<=m<=50000 题解 两个预处理f[i][j]为块i到j的逆序对数,s[i][j]前i块≤j的有多少个边角 ...

  7. BZOJ3787:Gty的文艺妹子序列(分块,树状数组)

    Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...

  8. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  9. BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

随机推荐

  1. HDU 1203 01背包

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. The XOR Largest Pair [Trie]

    描述 在给定的N个整数A1,A2--AN中选出两个进行xor运算,得到的结果最大是多少? 输入格式 第一行一个整数N,第二行N个整数A1-AN. 输出格式 一个整数表示答案. 样例输入 3 1 2 3 ...

  3. matlab求最大公约数和最小公倍数

    最大公约数:(函数) function n = zuidagongyueshu(a,b) if(a>b) tem = a; b = a; a = tmp; end for i=1:a c = r ...

  4. npm安装node-sass失败,EACCES: permission denied

    增加--unsafe-perm,即 sudo npm install node-sass --unsafe-perm --save-dev 成功安装node-sass

  5. lesson 4 再谈继承多态,抽象类和接口

    再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...

  6. rpmdb open failed解决方案

    1.前提条件:安装软件包的时候,被我手动终止了(可能出错原因)[root@dhcp yum.repos.d]# yum clean allrpmdb: Thread/process 4541/1406 ...

  7. bzoj 2005 NOI 2010 能量采集

    我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1 那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点 的gcd值*2-n*m,那么问题转化成了求每个点的 ...

  8. camera驱动框架分析(中)

    camera host的驱动 下面开始分析camera host吧,如果仅仅是想知道camera sensor驱动怎么写,而不想知道内部具体怎么个调用流程,怎么个架构设计,那可以跳过该部分,直接去看i ...

  9. Selenium2+python自动化67-用例失败自动截图【转载】

    前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图 ...

  10. 如何在qt中使用中文输入法

    参考: http://blog.csdn.net/u013812682/article/details/52101088 dpkg -L fcitx-frontend-qt5 到qt安装目录里find ...