求助TLE
  • 板块灌水区
  • 楼主_VirtualPoint_
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/16 19:43
  • 上次更新2024/4/16 21:15:09
查看原帖
求助TLE
794507
_VirtualPoint_楼主2024/4/16 19:43
#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];

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;
    } else {
        return fgcd(y, x%y);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> t;

    while (t--) {
        cin >> n;

        logs[0] = -1;
        ans = 0;
        
        for (long long i = 1; i <= n; i++) {
            cin >> 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;
			}
        }

        cout << ans << endl;
    }
	return 0;
}

听说灌水区大佬多。

求助https://www.luogu.com.cn/problem/P7009——Magical GCD怎么优化?

时间太长,TLE了。

2024/4/16 19:43
加载中...