zoukankan      html  css  js  c++  java
  • BZOJ 3289 Mato的文件管理(莫队+树状数组)

    【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3289

    【题目大意】

      求静态区间逆序对。

    【题解】

      我们对查询进行莫队操作,对于区间的删改我们可以计算出改变量对于逆序对的贡献,
      利用树状数组维护即可。

    【代码】

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring> 
    const int N=50100;
    using namespace std;
    typedef long long LL;
    int pos[N],a[N],disc[N],n,m,limit,i,l,r,c[N];
    struct Q{
        int l,r,id; LL ans;
        friend bool operator < (const Q &a,const Q &b){
            return pos[a.l]<pos[b.l]||(pos[a.l]==pos[b.l]&&a.r<b.r);
        }
    }ask[N];
    bool cmp(const Q &a,const Q &b){return a.id<b.id;}
    void read(int&a){
        char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
        a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
    }
    void update(int x,int val){while(x<=n)c[x]+=val,x+=x&-x;}
    LL query(int x){LL res=0;while(x)res+=c[x],x-=x&-x;return res;}
    int main(){
        read(n);
        limit=(int)sqrt(n+0.5);
        for(i=1;i<=n;i++){read(a[i]);pos[i]=(i-1)/limit+1;}
        for(int i=1;i<=n;i++)disc[i]=a[i];
        sort(disc+1,disc+n+1);
        for(int i=1;i<=n;i++)a[i]=lower_bound(disc+1,disc+n+1,a[i])-disc;
        read(m); memset(c,0,sizeof(c));
        for(int i=1;i<=m;i++){read(ask[i].l);read(ask[i].r);ask[i].id=i;}
        sort(ask+1,ask+m+1); LL ans=0;
        for(int i=1,l=1,r=0;i<=m;i++){
            while(r<ask[i].r)r++,update(a[r],1),ans+=r-l+1-query(a[r]);  
            while(r>ask[i].r)update(a[r],-1),ans-=r-l-query(a[r]),r--;  
            while(l<ask[i].l)update(a[l],-1),ans-=query(a[l]-1),l++;  
            while(l>ask[i].l)l--,update(a[l],1),ans+=query(a[l]-1);
            ask[i].ans=ans;
        }sort(ask+1,ask+m+1,cmp);
        for(int i=1;i<=m;i++)printf("%lld
    ",ask[i].ans);
        return 0;
    }
  • 相关阅读:
    监控里的主码流和子码流是什么意思
    监控硬盘容量计算
    一个能让你了解所有函数调用顺序的Android库
    电工选线
    oracle linux dtrace
    list all of the Oracle 12c hidden undocumented parameters
    Oracle Extended Tracing
    window 驱动开发
    win7 x64 dtrace
    How to Use Dtrace Tracing Ruby Executing
  • 原文地址:https://www.cnblogs.com/forever97/p/bzoj3289.html
Copyright © 2011-2022 走看看