求助,莫队代码QAQ
查看原帖
求助,莫队代码QAQ
115613
MYJ_aiie楼主2022/7/25 22:20

代码样例输出 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;
 } 
2022/7/25 22:20
加载中...