【题目链接】
【五倍经验链接】
【思路要点】
- 容易发现一种可行的费用流建边。
- 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。
- 时间复杂度 O(MKLogN) O ( M K L o g N ) 。
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
template <typename T> void read(T &x) {
x = 0; int f = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
x *= f;
}
struct Segment_Tree {
struct info {
int lmax, rmax, smax;
int lmin, rmin, smin;
int lmaxpos, lminpos;
int rmaxpos, rminpos;
int smaxl, sminl;
int smaxr, sminr;
int sum;
};
info merge(info a, info b) {
info ans;
ans.sum = a.sum + b.sum;