## 题目描述小 L 有一个长为 $n$ 的序列 $a$其中每一项 $a_i$ 都是一个 pair $p_i q_i$。为了让 $a$ 看起来规整一些他钦定 $p q$ 分别均为长为 $n$ 的排列。为了对 $a$ 的规整程度进行量化计算他给出了一个权值函数 $fa = displaystylesum_i = 1^n p_i max_j = 1^i - 1 p_j + q_i max_j =
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int MAXN = 500005;
const int MOD = 998244353;
int n, ans, cnt;
int p[MAXN], q[MAXN];
int dp[MAXN];
int st[MAXN], top;
int f[MAXN], g[MAXN];
inline void upd(int &x, int y) { x = (x + y) % MOD; }
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &p[i]);
for (int i = 1; i <= n; ++i) scanf("%d", &q[i]);
for (int i = 1; i <= n; ++i) {
while (top && p[i] > p[st[top]]) --top;
dp[i] = dp[st[top]] + (i - st[top]) * (n - i + 1);
st[++top] = i;
}
for (int i = 1; i <= n; ++i) {
while (top && q[i] < q[st[top]]) --top;
f[i] = dp[st[top]] + (i - st[top]) * (n - i + 1);
st[++top] = i;
}
top = 0;
for (int i = n; i; --i) {
while (top && p[i] > p[st[top]]) --top;
g[i] = dp[st[top]] + (st[top] - i) * (n - st[top] + 1);
st[++top] = i;
}
top = 0;
for (int i = n; i; --i) {
while (top && q[i] < q[st[top]]) --top;
ans = (ans + f[i] + g[st[top]] + (i - st[top]) * (n - st[top] + 1)) % MOD;
st[++top] = i;
}
top = 0;
for (int i = 1; i <= n; ++i) {
while (top && p[i] > p[st[top]]) --top;
if (top) {
int j = st[top];
if (j > 1 && p[j - 1] < p[i]) {
int now = (dp[j - 1] + (i - j + 1) * (n - i + 1)) % MOD;
if (dp[i] > now) {
cnt = 0;
for (int k = j; k <= i; ++k) {
if (p[k] > dp[j - 1] / (n - k + 1)) {
++cnt;
if (cnt > 2) break;
}
}
if (cnt == 1) ++ans;
}
}
}
st[++top] = i;
}
top = 0;
for (int i = n; i; --i) {
while (top && q[i] < q[st[top]]) --top;
if (top) {
int j = st[top];
if (j < n && q[j + 1] > q[i]) {
int now = (dp[j + 1] + (j - i + 1) * (n - j)) % MOD;
if (dp[i] > now) {
cnt = 0;
for (int k = i; k <= j; ++k) {
if (q[k] > dp[j + 1] / k) {
++cnt;
if (cnt > 2) break;
}
}
if (cnt == 1) ++ans;
}
}
}
st[++top] = i;
}
printf("%d %d\n", ans, cnt);
return 0;
原文地址: https://www.cveoy.top/t/topic/dRvq 著作权归作者所有。请勿转载和采集!