BZOJ 3289 Mato的文件管理

Posted on 2016-10-23 23:01  ziliuziliu  阅读(202)  评论(0编辑  收藏  举报

莫队+BIT。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 50050
using namespace std;
int n,m,a[maxn],hash[maxn],tot=0,ans=0,pos[maxn],block,t[maxn];
struct query
{
    int l,r,ans,id;
}p[maxn];
bool cmp1(query x,query y)
{
    if (pos[x.l]==pos[y.l]) return x.r<y.r;
    return pos[x.l]<pos[y.l];
}
bool cmp2(query x,query y)
{
    return x.id<y.id;
}
int lowbit(int x) {return (x&(-x));}
void modify(int x,int val)
{
    for (int i=x;i<=tot;i+=lowbit(i))
        t[i]+=val;
}
int ask(int x)
{
    int ret=0;
    for (int i=x;i>=1;i-=lowbit(i))
        ret+=t[i];
    return ret;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        hash[++tot]=a[i];
    }
    sort(hash+1,hash+tot+1);tot=unique(hash+1,hash+tot+1)-hash-1;
    for (int i=1;i<=n;i++) a[i]=lower_bound(hash+1,hash+tot+1,a[i])-hash;
    block=sqrt(n);
    for (int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&p[i].l,&p[i].r);
        p[i].id=i;
    }
    sort(p+1,p+m+1,cmp1);
    int l=1,r=0;
    for (int i=1;i<=m;i++)
    {
        for (int j=r;j<p[i].r;j++)
        {
            ans+=ask(tot)-ask(a[r+1]);
            modify(a[r+1],1);
            r++;
        }
        for (int j=r;j>p[i].r;j--)
        {
            ans-=ask(tot)-ask(a[r]);
            modify(a[r],-1);
            r--;
        }
        for (int j=l;j<p[i].l;j++)
        {
            ans-=ask(a[l]-1);
            modify(a[l],-1);
            l++;
        }
        for (int j=l;j>p[i].l;j--)
        {
            ans+=ask(a[l-1]-1);
            modify(a[l-1],1);
            l--;
        }
        p[i].ans=ans;
    }
    sort(p+1,p+m+1,cmp2);
    for (int i=1;i<=m;i++) printf("%d\n",p[i].ans);
    return 0;
}