• BZOJ3289 Mato的文件管理


    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

    本文作者:ljh2000
    作者博客:http://www.cnblogs.com/ljh2000-jump/
    转载请注明出处,侵权必究,保留最终解释权!

    题目链接:BZOJ3289

    正解:莫队算法+树状数组

    解题报告:

      考虑数据范围只有5w,二话不说上莫队。

      考虑加入一个点的时候,我只需根据是在前面还是后面,分别考虑一下就好了,离散化之后用树状数组维护数的个数,在前面的话就查询一下比他小的数的个数,在后面的话就查询一下比他大的数的个数,删除操作同理。

      1A了好开心QAQ

    //It is made by ljh2000
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <ctime>
    #include <vector>
    #include <queue>
    #include <map>
    #include <set>
    #include <string>
    #include <complex>
    #include <bitset>
    using namespace std;
    typedef long long LL;
    typedef long double LB;
    typedef complex<double> C;
    const double pi = acos(-1);
    const int MAXN = 50011;
    int n,a[MAXN],b[MAXN],block;
    int c[MAXN],m,Q;
    LL ans,A[MAXN];
    struct ask{ int l,r,bel,id; }q[MAXN];
    inline bool cmp(ask q,ask qq){ if(q.bel==qq.bel) return q.r<qq.r; return q.bel<qq.bel; }
    inline void add(int x,int val){ while(x<=m) c[x]+=val,x+=x&(-x); }
    inline int query(int x){ int tot=0; while(x>0) tot+=c[x],x-=x&(-x); return tot; }
    inline int getint(){
        int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
        if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
    }
    
    inline void work(){
    	n=getint(); for(int i=1;i<=n;i++) a[i]=b[i]=getint();
    	sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1;
    	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+m+1,a[i])-b;
    	block=sqrt(2*n);
    	Q=getint(); for(int i=1;i<=Q;i++) q[i].l=getint(),q[i].r=getint(),q[i].bel=(q[i].l-1)/block+1,q[i].id=i;
    	sort(q+1,q+Q+1,cmp);
    	int l=q[1].l,r=q[1].r;
    	for(int i=q[1].l;i<=q[1].r;i++) {
    		ans+=query(m)-query(a[i]);
    		add(a[i],1);
    		A[q[1].id]=ans;
    	}
    
    	for(int i=2;i<=Q;i++) {
    		while(r<q[i].r) r++,ans+=query(m)-query(a[r]),add(a[r],1);
    		while(l>q[i].l) l--,ans+=query(a[l]-1),add(a[l],1);
    		while(r>q[i].r) add(a[r],-1),ans-=query(m)-query(a[r]),r--;
    		while(l<q[i].l) add(a[l],-1),ans-=query(a[l]-1),l++;
    		A[q[i].id]=ans;
    	}
    	for(int i=1;i<=Q;i++) 
    		printf("%lld
    ",A[i]);
    }
    
    int main()
    {
        work();
        return 0;
    }
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    

      

  • 相关阅读:
    python学习之计算机基础详解
    python学习笔记-day03
    名称空间与作用域
    函数参数的应用
    day14
    day13
    函数的基本使用
    day12
    day 09
    文件操作
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/6518716.html
Copyright © 2020-2023  润新知