給你一個長度爲N的序列ai,1≤i≤N和q組詢問,每組詢問讀入l1,r1,l2,r2,需輸出
get(l,r,x)表示計算區間[l,r]中,數字x出現了多少次。
#include<algorithm> #include<cstdio> #include<cmath> #define MN 50000 #define f(c) for(int i=1;i<=c;i++) using namespace std; int in(){int f=1,x=0;char c=getchar(); for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1; for(;'0'<=c&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);return x*f;} struct Mo{int l,r,id,ad;}q[MN*4+5]; int n,Be[MN+5],size,a[MN+5],num1[MN+5],num2[MN+5],m,tot=0,L=0,R=0; long long res=0,Ans[MN+5]; bool cmp(Mo a,Mo b){return Be[a.l]==Be[b.l]?a.r<b.r:a.l<b.l;} int main(){n=in();size=sqrt(n); f(n)a[i]=in(),Be[i]=(i-1)/size+1;m=in(); f(m){int l1=in(),r1=in(),l2=in(),r2=in(); q[++tot]=(Mo){r1,r2,i,1};q[++tot]=(Mo){r1,l2-1,i,-1}; q[++tot]=(Mo){l1-1,r2,i,-1};q[++tot]=(Mo){l1-1,l2-1,i,1};} sort(q+1,q+tot+1,cmp); f(tot){while(L<q[i].l)++L,res+=num2[a[L]],++num1[a[L]]; while(L>q[i].l)res-=num2[a[L]],--num1[a[L]],--L; while(R<q[i].r)++R,res+=num1[a[R]],++num2[a[R]]; while(R>q[i].r)res-=num1[a[R]],--num2[a[R]],--R; Ans[q[i].id]+=q[i].ad*res;}f(m)printf("%lld\n",Ans[i]);return 0; }