zoukankan      html  css  js  c++  java
  • BZOJ 3289 Mato的文件管理

    莫队+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
    ",p[i].ans);
        return 0;
    }
  • 相关阅读:
    边界值分析
    等价类划分
    手工检测SQL注入(安全性测试)
    Web安全性测试
    Jmeter使用流程及简单分析监控
    使用可视化工具redisclient连接redis
    Java ThreadLocal的使用
    jvm中的新生代Eden和survivor区
    策略模式和工厂模式的区别
    java将一数组乱序排列
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5991382.html
Copyright © 2011-2022 走看看