TLE on #10
查看原帖
TLE on #10
866613
sansesantongshun楼主2024/3/7 12:05

主席树换成区间查询,常数大了?

#include<bits/stdc++.h>
using namespace std;
int n,m,x,a[40000005][3],b[1000005],cnt=0,c[1000005],y;
int read()
{
	int result=0;
	char ch=getchar();
	while (ch<'0' || ch>'9')
	ch=getchar();
	while ('0'<=ch && ch<='9')
	{
		result=result*10+(ch^48);
		ch=getchar();
	}
	return result;
}
void write(int x)
{
	if (x>=10)
	write(x/10);
	putchar(x%10|48);
}
int build(int l,int r)
{
	int x=++cnt;
	if (l<r)
	{
		int mid=l+r>>1;
		a[x][1]=build(l,mid);
		a[x][2]=build(mid+1,r);
	}
	return x;
}
int modify(int x,int bl,int br,int y,int z)
{
	++cnt;
	memcpy(a[cnt],a[x],sizeof(a[x]));
	x=cnt;
	if (bl==br)
	a[x][0]=z;
	else
	{
		int mid=bl+br>>1;
		if (y<=mid)
		a[x][1]=modify(a[x][1],bl,mid,y,z);
		else
		a[x][2]=modify(a[x][2],mid+1,br,y,z);
		a[x][0]=a[a[x][1]][0]+a[a[x][2]][0];
	}
	return x;
}
int query(int x,int bl,int br,int l,int r)
{
	if (l<=bl && br<=r)
	return a[x][0];
	int mid=bl+br>>1,result=0;
	if (l<=mid)
	result+=query(a[x][1],bl,mid,l,r);
	if (mid<r)
	result+=query(a[x][2],mid+1,br,l,r);
	return result;
}
int main()
{
	n=read();
	build(1,n);
	b[0]=1;
	for (int i=1;i<=n;++i)
	{
		x=read();
		if (c[x])
		b[i]=modify(modify(b[i-1],1,n,i,1),1,n,c[x],0);
		else
		b[i]=modify(b[i-1],1,n,i,1);
		c[x]=i;
	}
	m=read();
	while (m--)
	{
		x=read();
		y=read();
		write(query(b[y],1,n,x,y));
		putchar('\n');
	}
}

跑了2.05s

2024/3/7 12:05
加载中...