Solution of ABC D(非官方,自己写的,不用滑动窗口)
  • 板块学术版
  • 楼主DoubleQLzn
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/12/14 22:17
  • 上次更新2024/12/15 09:38:45
查看原帖
Solution of ABC D(非官方,自己写的,不用滑动窗口)
953149
DoubleQLzn楼主2024/12/14 22:17
  • 本题解在题解区开放后投稿并自删

首先做一个前缀和。

我们可以枚举 ll,看有没有合适的 rr。首先,如果是从 ll 开始的序列,分 22 种情况:

  • 不需要再次重复数组,直接二分 summidsuml1sum_{mid}-sum_{l-1} 看有没有存在即可。

  • 需要再次重复数组

    • 重复数组前已经用的 : sumnsumi1sum_n-sum_{i-1}
    • 还需要通过重复以及补充的为 ss 减掉上面的。
    • 除掉完整的整个数组的循环,需要 从 11 到任意一个 rr,区间和为 s(sumnsumi1)modsumns-(sum_n-sum_{i-1})\bmod sum_n。二分 summidsum_mid 即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200005],sum[200005];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,s;
	cin >> n >> s;
	for (int i = 1;i <= n;i++)
	{
		cin >> a[i];
		sum[i] = sum[i - 1] + a[i];
	}
	for (int i = 1;i <= n;i++)
	{
		int l1 = i,r1 = n,is = 0;
		while (l1 <= r1)
		{
			int mid = (l1 + r1) / 2;
			if (sum[mid] - sum[i - 1] == s) 
			{
				is = 1;
				break;
			}
			else if (sum[mid] - sum[i - 1] > s) r1 = mid - 1;
			else l1 = mid + 1;
		}
		int now = sum[n] - sum[i - 1];
		int need = s - now;
		int k = need % sum[n];
		int l = 0,r = n;
		
		while (l <= r)
		{
			int mid = (l + r) / 2;
			if (sum[mid] == k) 
			{
				is = 1;
				break;
			}
			else if (sum[mid] > k) r = mid - 1;
			else l = mid + 1;
		}
		if (is)
		{
			puts("Yes");
			return 0;
		}
	}
	puts("No");
	return 0;
}
2024/12/14 22:17
加载中...