神奇TLE求助
查看原帖
神奇TLE求助
389368
Hokma__楼主2024/5/23 08:21

不理解,感觉就是 O(nn)O(n \sqrt n) 的复杂度。

#include<bits/stdc++.h>
#define reg register
#define ll long long
#define MAXN 200005
#define maxn 405
using namespace std;
int n,p[MAXN],pt[MAXN],m,a,b,block;
int ip[MAXN],l[maxn],r[maxn],nus[MAXN];
int num[maxn][MAXN],maxt[maxn][maxn];
inline int read() 
{ 
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') 
	{ 
		if(c=='-') f=-1;
		c=getchar();
	} 
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*f;
} 
inline void write(int x) 
{ 
	if(x==0) 
	{ 
		putchar('0');
		return ;
	} 
	putchar('-');
	int len=0,k1=x,c[10005];
	if(k1<0) k1=-k1,putchar('-');
	while(k1) c[len++]=k1%10+'0',k1/=10;
	while(len--) putchar(c[len]);
	putchar('\n');
} 
void init() 
{ 
	int block=500;
	for(reg int i=1;i<=n;++i) 
	{ 
		ip[i]=(i-1)/block+1;
		if(ip[i]!=ip[i-1]) l[ip[i]]=i,r[ip[i]-1]=i-1;
	} 
	r[ip[n]]=n;
	for(reg int i=1;i<=ip[n];++i) 
	{ 
		int maxx=0;
		for(reg int j=r[i];j>=1;--j) 
		{ 
			++num[i][p[j]];
			if(num[i][p[j]]>num[i][maxx]) maxx=p[j];
			if(ip[j]!=ip[j-1]) maxt[ip[j]][i]=maxx;
		} 
	} 
} 
int ask(int L,int R) 
{ 
	if(ip[L]+1>=ip[R]) 
	{ 
		int maxx=0;
		for(reg int i=L;i<=R;++i) 
		{ 
			++nus[p[i]];
			if(nus[p[i]]>nus[maxx]) maxx=p[i];
		} 
		int ch=nus[maxx];
		for(int i=L;i<=R;++i) nus[p[i]]=0;
		return ch;
	} 
	int maxx=maxt[ip[L]+1][ip[R]-1];
	int alt=maxx;
	nus[maxx]=num[ip[R]-1][maxx]-num[ip[L]][maxx];
	for(reg int i=L;i<=r[ip[L]];++i) 
	{ 
		if(nus[p[i]]==0) nus[p[i]]+=(num[ip[R]-1][p[i]]-num[ip[L]][p[i]]);
		++nus[p[i]];
		if(nus[p[i]]>nus[maxx]) maxx=p[i];
	} 
	for(reg int i=l[ip[R]];i<=R;++i) 
	{ 
		if(nus[p[i]]==0) nus[p[i]]+=(num[ip[R]-1][p[i]]-num[ip[L]][p[i]]);
		++nus[p[i]];
		if(nus[p[i]]>nus[maxx]) maxx=p[i];
	} 
	int ch=nus[maxx];
	for(reg int i=L;i<=r[ip[L]];++i) nus[p[i]]=0;
	for(reg int i=l[ip[R]];i<=R;++i) nus[p[i]]=0;
	nus[alt]=0;
	return ch;
} 
int main() 
{ 
//	ios::sync_with_stdio(0);
//	cin.tie(0); cout.tie(0);
//	freopen("P3709_2.in","r",stdin);	
//	freopen("P3709_2.out","w",stdout);	
	n=read(),m=read();
	for(reg int i=1;i<=n;++i) 
		p[i]=read(),pt[i]=p[i];
	sort(pt+1,pt+1+n);
	int nu=unique(pt+1,pt+1+n)-pt-1;
	for(reg int i=1;i<=n;++i) 
		p[i]=lower_bound(pt+1,pt+1+nu,p[i])-pt;
	init();
	for(reg int i=1;i<=m;++i) 
	{ 
		a=read();b=read();
		if(a>b) swap(a,b);
		write(ask(a,b));
	} 

    return 0;
} 
2024/5/23 08:21
加载中...