30分求助,莫队+离散but RE+TLE
查看原帖
30分求助,莫队+离散but RE+TLE
655089
wch2021楼主2024/10/6 10:19

前三个点AC,中三个点TLE,后四个点RE dalao救我

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(!(ch<='9'&&ch>='0'))
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0')
	{
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void write(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar('0'+x%10);
}
int a[400005],b[400005],c[400005],bl,ans[400005];
struct node
{
	int l,r,x,id;
}q[400005];
bool cmp(node d,node e)
{
	if(d.l/bl==e.l/bl) return d.l<e.l;
	return d.l/bl<e.l/bl;
}
void add(int u)
{
	c[a[u]]++;
}
void del(int u)
{
	c[a[u]]--;
}
signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int T=read();
	while(T--)
	{
		memset(c,0,sizeof(c));
		int n=read();
		bl=sqrt(n);
		for(int i=1;i<=n;i++)
		{
			b[i]=a[i]=read();
		}
		sort(b+1,b+1+n);
		int si=unique(b+1,b+1+n)-b-1;
		for(int i=1;i<=n;i++)
		{
			a[i]=lower_bound(b+1,b+1+si,a[i])-b;
		}
		int Q=read();
		for(int i=1;i<=Q;i++)
		{
			q[i].id=i;
			q[i].l=read();
			q[i].r=read();
			q[i].x=read();
		}
		sort(q+1,q+1+Q,cmp);
		for(int i=1,L=1,R=0;i<=Q;i++)
		{
			while(R<q[i].r) add(++R);
			while(L>q[i].l) add(--L);
			while(R>q[i].r) del(R--);
			while(L<q[i].l) del(L++);
			ans[q[i].id]=c[q[i].x];
		}
		for(int i=1;i<=Q;i++)
		{
			write(ans[i]);
			putchar('\n');
		}
	}
	return 0;
}
2024/10/6 10:19
加载中...