Loading

4.17 CW 模拟赛 T2. 最长模区间

思路

不难把区间拆成间隔

发现具有单调性但是不好处理删除
于是考虑马鹿尺取\(\textrm{baka's trick}\)

pEhcyUH.png

所以实际上 \(l\) 会回退, 输

参考代码

#include <cstdio>
using namespace std;
typedef long long ll;
const int MAXN = 200005;
int T, N;
ll A[MAXN], resl[MAXN], resr;
ll ab(ll x) { return x < 0 ? -x : x; }
ll gcd(ll x, ll y) { return y ? gcd(y, x%y) : x; }
int max(int x, int y) { return x > y ? x : y; }
int main()
{
	for (scanf("%d", &T); T; T--) {
		scanf("%d", &N);
		for (int i=1; i<=N; i++) scanf("%lld", &A[i]);
		if (N==1) { puts("1"); continue; }
		for (int i=2; i<=N; i++) A[i-1] -= A[i], A[i-1] = ab(A[i-1]);
		//for (int i=1; i< N; i++) printf("%lld ", A[i]); puts("");
		int l = 1, r = 1, mid = 1, ans = A[1] > 1; // [l, mid], (mid, r];
		resl[1] = A[1]; if (A[1]==1) l = mid+1;
		while (r< N-1) {
			++r, resr = r==mid+1 ? A[r] : gcd(resr, A[r]);
			while (l<=mid && gcd(resl[l], resr)==1) l++;
			if (l> mid) {
				mid = r, l = r+1, resl[l] = A[l-1];
				while (l> 1 && (resl[l-1]=gcd(resl[l], A[l-1]))> 1) l--;
			}
			ans = max(ans, r-l+1);
			//printf("[%d, %d]\n", l, r);
		}
		printf("%d\n", ans+1);
	}
}
posted @ 2025-04-17 19:41  Yorg  阅读(21)  评论(0)    收藏  举报