您的位置:首页 > 其它

BZOJ 3236: [Ahoi2013]作业

2016-12-20 20:10 295 查看

3236: [Ahoi2013]作业

Time Limit: 100 Sec Memory Limit: 512 MB
Submit: 1438 Solved: 577
[Submit][Status][Discuss]

Description

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
//by NeighThorn
using namespace std;

const int maxn=100000+5,maxm=1000000+5;

int n,m,blo,c[maxn],id[maxn],tr[2][maxn],cnt[maxn];

struct M{
int l,r,a,b,num,ans1,ans2;
}q[maxm];

inline int read(void){
char ch=getchar();int x=0,f=1;
while(!(ch>='0'&&ch<='9')){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}

inline bool cmp1(const M &x,const M &y){
if(id[x.l]==id[y.l])
return x.r<y.r;
return x.l<y.l;
}

inline bool cmp2(const M &x,const M &y){
return x.num<y.num;
}

inline void insert(int k,int x,int y){
for(;x<=n;x+=x&(-x))
tr[k][x]+=y;
}

inline int query(int k,int x){
if(x<=0)
return 0;
int res=0;
for(;x;x-=x&(-x))
res+=tr[k][x];
return res;
}

inline void change(int pos,int x){
insert(0,c[pos],x);cnt[c[pos]]+=x;
if(cnt[c[pos]]==0&&x==-1)
insert(1,c[pos],-1);
else if(cnt[c[pos]]==1&&x==1)
insert(1,c[pos],1);
}

signed main(void){
memset(cnt,0,sizeof(cnt));
memset(tr,0,sizeof(tr));
n=read();m=read();blo=(int)(sqrt(n));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)
c[i]=read(),id[i]=(i-1)/blo+1;
for(int i=1;i<=m;i++)
q[i].l=read(),q[i].r=read(),q[i].a=read(),q[i].b=read(),q[i].num=i;
sort(q+1,q+m+1,cmp1);
for(int i=1,l=q[1].l,r=q[1].l-1;i<=m;i++){
for(;l<q[i].l;l++)
change(l,-1);
for(;l>q[i].l;l--)
change(l-1,1);
for(;r<q[i].r;r++)
change(r+1,1);
for(;r>q[i].r;r--)
change(r,-1);
q[i].ans1=query(0,q[i].b)-query(0,q[i].a-1);
q[i].ans2=query(1,q[i].b)-query(1,q[i].a-1);
}
sort(q+1,q+m+1,cmp2);
for(int i=1;i<=m;i++)
printf("%d %d\n",q[i].ans1,q[i].ans2);
return 0;
}


View Code

by NeighThorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: