BZOJ3289 Mato的文件管理
Posted ljh2000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\\n",A[i]); } int main() { work(); return 0; } //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
以上是关于BZOJ3289 Mato的文件管理的主要内容,如果未能解决你的问题,请参考以下文章