CF1333C Eugene and an array
提供一种复杂度为 的做法。
考虑数据结构加二分。
如果我们指定某个区间的 ,那么你可以发现的是,区间是否存在连续子序列和为 是单调性的,即如果 时,有区间和为 ,那么对于 ,也一定有。
所以可以考虑枚举 ,二分 。接下来考虑如何判定区间是否有和为 。
可以将原序列做一次前缀和,那么如果一个区间内有和为 ,意味着区间内有一个数本身为 ,或者其前缀和中有两个或以上相同的数。判断是否有两个或以上相同的可以考虑莫队等数据结构维护,但是是离线的,而二分必须在线。考虑设 ,即前缀和,设 为 ,询问区间 ,相当于询问区间的 的最大值。考虑 st 表预处理。询问是否有 本身,即询问区间内某个数的出现次数,考虑 vector
上二分可以在线处理。
#pragma GCC optimize("-Ofast")
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <cstring>
using namespace std;
#define int long long
const int N = 2e5 + 5, M = 25;
int a[N], n, pre[N], p[N], LG2[N], s2[N];
vector<int> b;
map<int, vector<int> > pee;
void Init()
{
LG2[1] = 0;
LG2[2] = 1;
for (int i = 3; i < N; i++)
{
LG2[i] = LG2[i / 2] + 1;
}
}
int f[N][M];
inline int query(int l, int r)
{
int x = LG2[r - l + 1];
return max(f[l][x], f[r - (1LL << x) + 1][x]);
}
signed main()
{
Init();
scanf("%lld", &n);
int ret = n * (n - 1) / 2 + n;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
if (a[i] == 0) ret--;
a[i] += a[i - 1];
s2[i] = a[i];
b.push_back(a[i]);
pee[a[i]].push_back(i);
}
sort(b.begin(), b.end());
b.erase(unique(b.begin(), b.end()), b.end());
for (int i = 1; i <= n; i++) a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin() + 1;
for (int i = 1; i <= n; i++)
{
pre[i] = p[a[i]];
p[a[i]] = i;
}
for (int i = 1; i <= n; i++)
{
f[i][0] = pre[i];
}
for (int j = 1; j < M; j++)
{
for (int i = 1; i + (1ll << j) - 1 <= n; i++)
{
f[i][j] = max(f[i][j - 1], f[i + (1ll << (j - 1))][j - 1]);
}
}
for (int i = 1; i < n; i++)
{
int l = i, r = n + 1, place = -1;
while (l + 1 < r)
{
int mid = l + r >> 1;
int x = query(i, mid);
if ((x >= i - 1 && x != 0) || upper_bound(pee[-s2[i - 1]].begin(), pee[-s2[i - 1]].end(), mid) - lower_bound(pee[-s2[i - 1]].begin(), pee[-s2[i - 1]].end(), i) >= 1) r = mid, place = mid;
else l = mid;
}
//printf("%lld %lld %lld\n", i, place, query(i, place));
if (place != -1) ret -= (n - place + 1);
}
printf("%lld\n", ret);
return 0;
}
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 提升Avalonia UI质感,跨平台图标库选型实践
· 告别图形界面:Windows系统OpenSSH服务部署
· C# 中委托和事件的深度剖析与应用场景
· 突发,CSDN 崩了!程序员们开始慌了?
· 一个基于 .NET 8 + Ant Design Blazor 开发的简洁现代后台管理框架