链接
http://www.lydsy.com/JudgeOnline/problem.php?id=3289
题解
直接上莫队,用权值树状数组统计答案。
时间复杂度
O(NN−−√logN2)
,空间复杂度
O(N)
代码
//莫队
#include <cstdio>
#include <algorithm>
#define lowbit(x) (x bitand -x)
#define maxn 60000
#define size 233
using namespace std;
int N, Q, lp[maxn], tmp[maxn], byte[maxn], ta[maxn], num[maxn], q[maxn][2], ans[maxn];
void add(int *r, int pos, int v){for(;pos<=N;pos+=lowbit(pos))ta[pos]+=v;}
int sum(int *r, int pos){int ans=0;for(;pos;pos-=lowbit(pos))ans+=ta[pos];return ans;}
bool cmp(int a, int b)
{return lp[q[a][0]]==lp[q[b][0]]?q[a][1]<q[b][1]:lp[q[a][0]]<lp[q[b][0]];}
void init()
{
int i;
scanf("%d",&N);
for(i=1;i<=N;i++)scanf("%d",byte+i),tmp[i]=byte[i];
sort(tmp+1,tmp+N+1);
for(i=1;i<=N;i++)byte[i]=lower_bound(tmp+1,tmp+N+1,byte[i])-tmp;
for(i=1;i<=N;i++)lp[i]=i/size;
scanf("%d",&Q);
for(i=1;i<=Q;i++)scanf("%d%d",q[i],q[i]+1),num[i]=i;
sort(num+1,num+Q+1,cmp);
}
void solve()
{
int l=0, r=0, ql, qr, i, cnt=0;
for(i=1;i<=Q;i++)
{
ql=q[num[i]][0], qr=q[num[i]][1];
for(;l<ql;l++)if(l)
{
cnt-=sum(ta,byte[l]-1);
add(ta,byte[l],-1);
}
for(l--;l>=ql;l--)
{
cnt+=sum(ta,byte[l]-1);
add(ta,byte[l],1);
}
l=ql;
for(;r>qr;r--)
{
cnt-=r-l+1-sum(ta,byte[r]);
add(ta,byte[r],-1);
}
for(r++;r<=qr;r++)
{
cnt+=r-l-sum(ta,byte[r]);
add(ta,byte[r],1);
}
r=qr;
ans[num[i]]=cnt;
}
}
int main()
{
init();
solve();
for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
return 0;
}