题意:在长度为n的范围内有m个区间,现要求另选两个长度为k的区间染色,现求每个区间被最大染色和的最大值。
分析:对于每个位置i往后染k个颜色预处理对最终答案的贡献ans[i],以及染完这k个之后如果下一个区间从j开始染,由于j处染色部分大,i处的染色无法计算而丢失的贡献sub[i][j]。
维护好ans[N],sub[N][N]这两个数组后就只需要O(n^2)找出哪选哪两个最大就好了。
大体思路就是这样,具体细节还需要注意很多,比如预处理sub[N][N]数组时需要用到差分,区间内染色大小相同时都要减去贡献,所以sub维护的实际上是丢失的贡献的二倍
代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define mid (l+r>>1)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int>pii;
typedef vector<int>vi;
struct tri {int a, b, c;};
const int N = 2e3 + 10;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
int n, m, k, ans[N], sub[N][N << 1];
pii arr[N];
void solve(int l)
{
int r = l + k - 1;
for(int i = 1; i <= m; i++)
{