Блог пользователя fluxgamer999

Автор fluxgamer999, история, 7 месяцев назад, По-английски

[submission:257656771][problem:1547F] The Maximum Number of Operation we Need is N : so we do binary search On ans the element at ith index at kth step will be gcd of range (i,k) for range gcd i used segTree.

int n ;
	cin >> n  ;
	vector<int> a(2 * n);
	for (int i = 0 ; i < n ; i++) {
		cin >> a[i];
	}
	for (int i = 0 ; i < n ; i++) {
		a[n + i] = a[i];
	}
	int temp = 2 * n ;
	int temp2 = 2 * n ;
	while ((temp2) & (temp2 - 1)) {
		temp2++;
		a.pb(0);
	}
	vector<int> seg(2 * temp2);
	for (int i = 0 ; i < temp2 ; i++) {
		seg[temp2 + i] = a[i];
	}
	for (int i = temp2 - 1 ; i >= 1; i--) {
		seg[i] = __gcd(seg[2 * i], seg[2 * i + 1]);
	}
	auto query = [&](int l , int r) {
		l += temp2;
		r += temp2;
		int ans = 0 ;
		while (l < r) {
			if (l & 1) ans = __gcd(ans, seg[l++]);
			if (r & 1) ans = __gcd(ans, seg[--r]);
			l /= 2; r /= 2;
		}
		return ans ;
	};
	debug(a);
	auto check = [&](int mid) {
		set<int> s ;
		for (int i = 0 ; i < n ; i++) {
			int r = i + mid + 1  ;
		// 	cout << i << " " << r << " " << query(i, r) << endl;
			s.insert(query(i, r));
		}
		return (s.size() == 1);
	};
	int lo = 0 ;
	int hi = n  ;
	int ans = 0 ;
	while (lo <= hi) {
		int mid  =  (hi + lo) / 2 ;
		if (check(mid)) {
			ans = mid ;
			hi = mid - 1 ;
		}
		else {
			lo = mid + 1 ;
		}
	}
	cout << ans << endl;
  • Проголосовать: нравится
  • -1
  • Проголосовать: не нравится