CF1428F Fruit Sequences 题解
使用了一种和大多数题解不同的做法。
虽然是带
思路#
首先考虑如何求一个固定左端点的答案。
我们发现,每个答案会随着右端点的递增单调不降。
而每个答案在增加时会形成若干个区间。
例如:
11101010111111
我们答案增加的区间即为:
11100000000111
可以发现,这个区间就是不断往前找到第一个长度大于当前极长连续段的极长连续段。
那么我们对于每个点统计出往后的全一极长连续段的长度。
就可以将所有询问简单的用堆维护。
Code#
/**
* @file 1428F.cpp
* @author mfeitveer
* @date 2023-11-10
*
* @copyright Copyright (c) 2023
*
*/
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define mp(x, y) make_pair(x, y)
#define fro(i, x, y) for(int i = (x);i <= (y);i++)
#define pre(i, x, y) for(int i = (x);i >= (y);i--)
#define dbg cerr << "Line " << __LINE__ << ": "
#define EVAL(x) #x " = " << (x)
typedef int64_t i64;
typedef uint32_t u32;
typedef uint64_t u64;
typedef __int128_t i128;
typedef __uint128_t u128;
typedef pair<int, int> PII;
bool ed;
const int N = 1000010;
const int mod = 998244353;
int n, m, a[N], sz[N], len[N], sum[N];
string s;
inline void solve()
{
cin >> n >> s;
fro(i, 1, n) a[i] = s[i - 1] - '0';
fill(sz + 1, sz + n + 1, 1);
fro(i, 1, n) if(a[i])
{
int j = i; while(a[j + 1]) j++;
fro(k, i, j) len[k] = j - k + 1; i = j;
}
priority_queue<PII, vector<PII>, greater<PII>> q;
fro(i, 1, n)
{
while(!q.empty() && q.top().x < len[i])
{
int x = q.top().y;
sum[i + len[x]] += sz[x];
sum[i + len[i]] -= sz[x];
sz[i] += sz[x], q.pop();
}
q.emplace(len[i], i);
sum[i] += 1, sum[i + len[i]] -= 1;
}
i64 ans = 0, num = 0, all = 0;
fro(i, 1, n) num += sum[i], all += num, ans += all;
cout << ans << "\n";
}
bool st;
signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
double Mib = fabs((&ed-&st)/1048576.), Lim = 250;
assert(Mib<=Lim), cerr << " Memory: " << Mib << "\n";
solve();
return 0;
}
作者:JiaY19
出处:https://www.cnblogs.com/JiaY19/p/17824441.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)