依旧TLE
查看原帖
依旧TLE
794507
_VirtualPoint_楼主2024/4/17 18:15
#include <iostream>
#include <algorithm>
using namespace std; 

long long t;
long long n, m;
long long ans = 0;

long long a[100005];
long long logs[100005];
long long dp[100005][100];

inline long long read(long long &a){
	int w=0,f=1;
	char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
	a=w*f; 
}

void write(long long x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}

extern inline long long fgcd(long long x, long long y);

long long ask(long long x, long long y){
	long long lg = logs[y-x+1];

	return fgcd(dp[x][lg], dp[y-(1<<lg)+1][lg]);
}

inline long long fgcd(long long x, long long y) {
    if (x % y == 0) {
        return y;
    }
    return fgcd(y, x%y);
}

int main() {
    read(t);

    while (t--) {
        read(n);

        logs[0] = -1;
        ans = 0;
        
        for (long long i = 1; i <= n; i++) {
            read(a[i]);
            
            dp[i][0] = a[i];
            
            logs[i] = logs[i>>1]+1;
        }
        
        for (long long j = 1; j <= logs[n]; j++) {
            for (long long i = 1; (i+(1<<j)-1) <= n; i++) {
                dp[i][j] = fgcd(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
            }
        }
        
        for (long long i = 1; i <= n; i++) {
            long long x = i;

            while (x <= n) {
            	long long l = x, r = n+1;
            	long long k = ask(i, x);

            	while(l - r > 1){
            		long long mid = (l + r) / 2;

            		if (ask(i, mid) == k) {
                        l = mid;
                    } else {
                        r = mid;
                    }
				}

				ans = max(ans, k * (l-i+1));
				x = l + 1;
			}
        }

        write(ans);
        putchar(' ');
        putchar('\n');  
    }
	return 0;
}

TLE 8.20s

已经开快读了,丝毫没有变化。。。难道是我快读写错了?

2024/4/17 18:15
加载中...