首先做一个前缀和。
我们可以枚举 l,看有没有合适的 r。首先,如果是从 l 开始的序列,分 2 种情况:
不需要再次重复数组,直接二分 summid−suml−1 看有没有存在即可。
需要再次重复数组
#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;
}