代码超时求优化
查看原帖
代码超时求优化
192044
tobie楼主2020/12/31 21:22

RT,这题提交好多次了,不知道为什么总是TLE,但是时间复杂度又没有问题。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
const int N=100009;
long long st[N][30];
int lg[N],n;
long long a[N];
long long res=0;
inline long long query(int l,int r)
{
	int x=log2(r-l+1);
	return __gcd(st[l][x],st[r-(1ll<<x)+1][x]);
}
inline int erfen(int lef,long long s)
{
	register int l=lef,r=n,mid,ans=lef;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if(query(lef,mid)==s)
		{
			l=mid+1;
			ans=mid;
		}
		else r=mid-1;
	}
	return ans;
}
int T;
int main()
{
	scanf("%d",&T);
//	for(int i=2;i<=100000;i++)
//	lg[i]=lg[i/2]+1;
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%lld",&st[i][0]);
		for(register int j=1;j<=20;j++)
		for(register int i=1;i<=n-(1<<j)+1;i++)
		{
			st[i][j]=__gcd(st[i][j-1],st[i+(1<<(j-1))][j-1]);
		}
		res=0;
		for(register int i=1;i<=n;i++)
		{
			for(register int j=i,next=0;j<=n;j=next+1)
			{
				next=erfen(i,query(i,j));
		//		cout<<i<<" "<<j<<" "<<next<<endl;
				res=max(res,1ll*(next-i+1)*query(i,j));
			}
		}
		printf("%lld\n",res);
	}
	return 0;
}
2020/12/31 21:22
加载中...