区间最大值和最小值的绝对值相等,有以下两种情况:
第一种情况:区间中只有同一种数字。这个比较简单,通过简单的for循环向后计数得到。
第二种情况:区间中最大值和最小值为相反数。
第二种情况具体来说,就是最大值1,最小值-1,和最大值2,最小值-2。
考虑如何求解第二种情况。
考虑固定左端点时,如何找合法的右端点:
1. 对于最大值为1最小值-1的情况:右端点需要保证:区间中有1和-1,区间中没有2和-2。这可以通
过维护左端点向后的1/-1/2/-2的初始位置找到。右端点的起始位置为max(下一个1的位置,下一
个-1的位置),结束位置为min(下一个2的位置,下一个-2的位置)
2. 对于最大值为2最小值-2的情况:右端点需要保证:区间中有2和-2。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 5e5 + 10;
const int inf = 0x3f3f3f3f;
ll n, ans, num[maxn];
int nxt[maxn][5];
int startpos, endpos;
// -2 --> 0 // -1 --> 1
// 1 --> 3 // 2 --> 4
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
memset(nxt, 0x3f, sizeof nxt);
for(int i = 1;i <= n; ++i) {
&nb

本文解析了如何在给定区间中找到最大值和最小值为相反数(如1和-1,或2和-2)的合法右端点,通过维护状态并更新边界条件。介绍了两种情况的处理策略,并提供了一段C++代码实现。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



