代码样例输出 5 和 4。
现在基本可以确认错误就是在 64 行到 73 行和 30 行到39行。
万分感谢QAQ
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=50015;
int n,Q;
int kuai_n;
int a[N],tot=0;
long long anss[4*N],ans=0,cnt[N];
struct node
{
int l,r,id,f;
}q[4*N];
void add(int i,int tot,int l,int r,int f)
{
q[tot].id=i;
q[tot].l=l;
q[tot].r=r;
q[tot].f=f;
}
int blk(int x)
{
return (x-1)/kuai_n+1;
}
bool cmp(node a,node b)
{
return blk(a.l)==blk(b.l)?(blk(a.l)&1?a.r<b.r:a.r>b.r):a.l<b.l;
}
void add(int x)
{
cnt[a[x]]++;
ans+=cnt[a[x]];
}
void del(int x)
{
ans-=cnt[a[x]];
cnt[a[x]]--;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&Q);
kuai_n=n*sqrt(Q);
int l1,l2,r1,r2;
for(int i=1;i<=Q;i++)
{
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
add(i,++tot,r1,r2,1);
add(i,++tot,l1-1,r2,-1);
add(i,++tot,r1,l2-1,-1);
add(i,++tot,l1-1,l2-1,1);
}
for(int i=1;i<=tot;i++)
{
if(q[i].l>q[i].r) swap(q[i].l,q[i].r);
}
sort(q+1,q+1+tot,cmp);
int l=1,r=0;
for(int i=1;i<=tot;i++)
{
if(q[i].l<1||q[i].r<1)continue;
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
while(l<q[i].l) del(l++);
while(r>q[i].r) del(r--);
anss[q[i].id]+=q[i].f*ans;
}
for(int i=1;i<=Q;i++)
{
printf("%lld\n",anss[i]);
}
return 0;
}