题解:因为题意很容易懂,所以直接说题;
我们可以将关系式变换一下get(l1,r1,x)*get(l2,r2,x)=get(0,r1,x)*get(0,r2,x)+get(0,l1-1,x)*get(0,l2-1,x)+get(l2-1,r2,x)*get(0,l1-1,x)-get(l1-1,r1,x)*get(0,l1-1,x);然后利用莫队算法即可。
AC代码为:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
const int INF=0x3f3f3f3f;
struct node{
int L;
int R;
int Id;
int sign;
} p[4*maxn];
int a[maxn],block,pos[maxn];
long long cnt[maxn],cntc[maxn],num[maxn];
bool cmp(const node &a,const node &b)
{
return pos[a.L]==pos[b.L]? a.R<b.R : pos[a.L]<pos[b.L];
}
int main()
{
int N,M,l1,l2,r1,r2;
while(scanf("%d",&N)!=EOF)
{
long long flag=0;
memset(cnt,0,sizeof(cnt));
memset(cntc,0,sizeof(cntc));
block=sqrt(N);
for(int i=1;i<=N;i++)
{
cin>>a[i];
pos[i]=(i-1)/block+1;
}
cin>>M;
for(int i=1;i<=M;i++)
{
cin>>l1>>r1>>l2>>r2;
p[++flag]=node{r1,r2,i,1};
p[++flag]=node{r2,l1-1,i,-1};
p[++flag]=node{l2-1,r1,i,-1};
p[++flag]=node{l1-1,l2-1,i,1};
}
sort(p+1,p+flag+1,cmp);
int l=0,r=0,ans=0;
for(int i=1;i<=flag;i++)
{
while(l<p[i].L)
{
l++;
ans+=cntc[a[l]];
cnt[a[l]]++;
}
while(l>p[i].L)
{
ans-=cntc[a[l]];
cnt[a[l]]--;
l--;
}
while(r<p[i].R)
{
r++;
ans+=cnt[a[r]];
cntc[a[r]]++;
}
while(r>p[i].R)
{
ans-=cnt[a[r]];
cntc[a[r]]--;
r--;
}
num[p[i].Id]+=ans*p[i].sign;
}
for(int i=1;i<=M;i++)
cout<<num[i]<<endl;
}
return 0;
}