P9991 [Ynoi Easy Round 2023] TEST_107 题解
思路#
题目即要求删除区间中的一个或多个颜色。
考虑假如枚举删除颜色
那么在
其中
可以分类讨论。
-
答案为
,那么只需要维护 中位置最小的 即可,对于所有颜色就是所有的位置的最大值,可以使用扫描线和线段树。 -
答案为
,那么只需要维护 中位置最大的 即可,对于所有颜色就是所有的位置的最小值,仍然可以使用扫描线和线段树。 -
答案为
,继续使用扫描线和线段树,每一次新加数时,在上一个位置记录此子区间的答案即可。
发现线段树只需要单点赋值,区间最值。
使用 zkw 线段树就非常方便啦。
Code#
#include <bits/stdc++.h>
using namespace std;
#define fro(i, x, y) for(int i = (x);i <= (y);i++)
#define pre(i, x, y) for(int i = (x);i >= (y);i--)
const int N = 10000010;
int n, m, k, a[N], las[N];
int cnt, l[N], r[N], ans[N], head[N];
struct edge { int to, nxt; } e[N];
int t[N];
inline void upd(int x, int y)
{
t[x += k] = y;
for(x >>= 1; x; x >>= 1)
t[x] = max(t[x<<1], t[x<<1|1]);
}
inline int ask(int l, int r)
{
int res = -1e9;
for(l += k - 1, r += k + 1; l ^ r ^ 1;)
{
if((l & 1) == 0) res = max(res, t[l ^ 1]);
if((r & 1) == 1) res = max(res, t[r ^ 1]);
l >>= 1, r >>= 1;
}
return res;
}
inline void fill() { memset(t, -0x3f, sizeof t), memset(las, 0, sizeof las); }
inline void ckmax(int &x, int y) { x = max(x, y); }
inline void add(int x, int y) { e[++cnt] = {y, head[x]}, head[x] = cnt; }
signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m, k = 1;
fro(i, 1, n) cin >> a[i];
fro(i, 1, m) cin >> l[i] >> r[i];
while(k <= n + 1) k <<= 1;
fro(i, 1, m) add(r[i], i);
fill();
fro(i, 1, n)
{
if(las[a[i]])
upd(las[a[i]], i - las[a[i]] - 1);
las[a[i]] = i;
for(int j = head[i]; j; j = e[j].nxt)
ckmax(ans[e[j].to], ask(l[e[j].to], r[e[j].to]));
}
fill();
fro(i, 1, n)
{
if(las[a[i]]) upd(las[a[i]], -1e9);
upd(i, -i), las[a[i]] = i;
for(int j = head[i]; j; j = e[j].nxt)
ckmax(ans[e[j].to], i + ask(l[e[j].to], r[e[j].to]));
}
fill();
memset(head, 0, sizeof head), cnt = 0;
fro(i, 1, m) add(l[i], i);
pre(i, n, 1)
{
if(las[a[i]]) upd(las[a[i]], -1e9);
upd(i, i), las[a[i]] = i;
for(int j = head[i]; j; j = e[j].nxt)
ckmax(ans[e[j].to], ask(l[e[j].to], r[e[j].to]) - i);
}
fro(i, 1, m) cout << ans[i] << "\n";
return 0;
}
作者:JiaY19
出处:https://www.cnblogs.com/JiaY19/p/17935154.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)