Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。
对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。
为了方便,我们规定妹子们的美丽度全都在[1,n]中。
给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl...sr中,权值∈[a,b]的权值的种类数。
标签:
对每个询问,单独输出一行,表示sl...sr中权值∈[a,b]的权值的种类数。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #define inf 1<<30 7 #define maxn 100005 8 #define maxm 1000005 9 using namespace std; 10 int n,m,a[maxn],pos[maxn],ans[maxm],t[maxn],sum[maxn]; 11 struct fuck{int l,r,id,a,b;}pps[maxm]; 12 int read(){ 13 int x=0,f=1;char ch; 14 for(ch=getchar();ch<‘0‘||ch>‘9‘;ch=getchar()) if(ch==‘-‘) f=-1; 15 for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; 16 return x*f; 17 } 18 bool comp(fuck a,fuck b){ 19 if(pos[a.l]==pos[b.l]) 20 if(pos[a.l]&1) return a.r<b.r; 21 else return a.r>b.r; 22 return pos[a.l]<pos[b.l]; 23 } 24 void change(int x,int y){for(int i=x;i<=n;i+=i&-i)t[i]+=y;} 25 void updata(int x,int y){ 26 sum[x]+=y; 27 if(y==-1&&sum[x]==0) change(x,y); 28 if(y==1&&sum[x]==1) change(x,y); 29 } 30 int query(int x){int y=0;for(int i=x;i;i-=x&-i)y+=t[i];return y;} 31 int main(){ 32 n=read(); m=read(); int sn=sqrt(n); 33 for(int i=1;i<=n;i++) pos[i]=(i-1)/sn+1; 34 for(int i=1;i<=n;i++) a[i]=read(); 35 for(int i=1;i<=m;i++) pps[i].l=read(),pps[i].r=read(),pps[i].a=read(),pps[i].b=read(),pps[i].id=i; 36 sort(pps+1,pps+m+1,comp); 37 for(int i=1,l=0,r=0;i<=m;i++){ 38 for(;l<pps[i].l;l++) updata(a[l],-1); 39 for(;l>pps[i].l;l--) updata(a[l-1],1); 40 for(;r<pps[i].r;r++) updata(a[r+1],1); 41 for(;r>pps[i].r;r--) updata(a[r],-1); 42 ans[pps[i].id]=query(pps[i].b)-query(pps[i].a-1); 43 } 44 for(int i=1;i<=m;i++) printf("%d\n",ans[i]); 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/longshengblog/p/5573423.html