CF1707E Replace
由题意可以发现一个性质:
\[f[(l, r)] = \bigcup_{i = l}^{r - 1} f[(i, i + 1)]
\]
进而可以推广至:
\[f^k[(l, r)] = \bigcup_{i = l}^{r - 1} f^k[(i, i + 1)]
\]
证明显然,即若 \([l_1, r_1] \cap [l_2, r_2]\),则 \(f([l_1, r_1] \cup [l_2, r_2]) = f((l_1, r_1)) \cup f((l_2, r_2))\)。
然后可以倍增维护。
设 \(g(i, j, k)\) 表示 \(f^{2^k}[(i, i + 2^j)]\),正常做就好。时间复杂度 \(\mathcal O(n \log^2 n + q \log n)\)。
代码:
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e5 + 10, K = 18;
int n, q, lg[N], a[N];
struct Node {
int l, r;
Node operator+(const Node &rhs) const {return {min(l, rhs.l), max(r, rhs.r)};}
} g[N][K][K];
inline Node f(int l, int r, int k) {
int ln = lg[r - l];
return g[l][ln][k] + g[r - (1 << ln)][ln][k];
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> q; for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
for (int i = 1; i < n; i++) g[i][0][0] = {min(a[i], a[i + 1]), max(a[i], a[i + 1])};
for (int j = 1; j < K; j++) {
for (int i = 1; i + (1 << j) <= n; i++) {
g[i][j][0] = g[i][j - 1][0] + g[i + (1 << (j - 1))][j - 1][0];
}
}
for (int k = 1; k < K; k++) {
for (int j = 0; j < K; j++) {
for (int i = 1; i + (1 << j) <= n; i++) {
g[i][j][k] = f(g[i][j][k - 1].l, g[i][j][k - 1].r, k - 1);
}
}
}
while (q--) {
int l, r, ans = 1; cin >> l >> r;
if (r - l + 1 == n) {cout << "0\n"; continue;}
if (l == r) {cout << "-1\n"; continue;}
for (int k = K - 1; k >= 0; k--) {
Node to = f(l, r, k);
if (1 < to.l || to.r < n) l = to.l, r = to.r, ans += (1 << k);
}
Node now = f(l, r, 1);
if (now.l == 1 && now.r == n) cout << ans << '\n';
else cout << "-1\n";
}
return 0;
}
作者:chy12321
出处:https://www.cnblogs.com/chy12321/p/17953649
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现