[ABC352D]题解
题意
在长为 的序列 中 找出 个数,设它们的下表为 $p_1 p_2$ 到 ,满足这 个数从小到大排列过后是一个公差为 的等差数列。求满足条件的 个数的最大的 减去 最小的 最小。输出这个值。
思路
把数组 排一遍序,滑动窗口维护最大和最小的 旧行了。
代码
#include <bits/stdc++.h> using namespace std; pair<int, int> b[200010]; int a[200010]; int p1[200010], p2[200010]; signed main() { int n, k; cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> b[i].first; b[i].second = i; } sort(b + 1, b + n + 1); for (int i = 1; i <= n; i++) a[i] = b[i].second; deque<int> q; for (int i = 1; i <= n; i++) { while (!q.empty() && a[q.back()] > a[i]) q.pop_back(); q.push_back(i); if (i >= k) { while (!q.empty() && q.front() <= i - k) q.pop_front(); p1[i] = a[q.front()]; } } while (!q.empty()) q.pop_back(); for (int i = 1; i <= n; i++) { while (!q.empty() && a[q.back()] < a[i]) q.pop_back(); q.push_back(i); if (i >= k) { while (!q.empty() && q.front() <= i - k) q.pop_front(); p2[i] = a[q.front()]; } } int ans = 0x3f3f3f3f; for (int i = k; i <= n; i++) { ans = min(p2[i] - p1[i], ans); } cout << ans; return 0; }
本文作者:merlinkkk
本文链接:https://www.cnblogs.com/merlinkkk/p/18306113
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步