首页 > 代码库 > BZOJ 3289 Mato的文件管理
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\n",p[i].ans); return 0; }
BZOJ 3289 Mato的文件管理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。