NOI.AC #111. 运气大战
题目传送门
分析
如果没有错排这个条件,根据排序不等式,肯定直接排序优秀。
有了错排这个条件,有一个神奇的结论,如果第 i i i个数匹配的是第 j j j个数,那么 ∣ i − j ∣ ≤ 2 |i-j|\le 2 ∣i−j∣≤2
排序之后考虑 D p Dp Dp
如果 i i i和 j j j可以匹配,那么有
f [ i ] = f [ i − 1 ] + w [ i ] ⋅ r [ i ] f[i]=f[i-1]+w[i]\cdot r[i] f[i]=f[i−1]+w[i]⋅r[i](排序后)
注意到这样转移一定是最优的。
否则的话讨论一下错排,转移类似。
良心出题人没有卡常,可以过。
数据大一点的话,就要考虑动态 D p Dp Dp
实际上转移方程式是一个带 M a x Max Max的三阶递推。
用线段树维护矩阵乘法即可。
复杂度 O ( q n ) O(qn) O(qn)或 O ( q l o g n ) O(qlogn) O(qlogn)
代码
暴力改
#include<bits/stdc++.h>
const int N = 3e4 + 10; const long long inf = 1e18;
int ri() {
char c = getchar(); int x = 0, f = 1; for(;c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
for(;c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x * f;
}
int n, q, w[N], r[N], c1[N], c2[N], loc[N];
long long cost[N][2], f[N];
bool cmp1(