题意 给出一个k维度空间,求[l,r]的最大曼哈顿距离。
用二进制枚举绝对值相加可能出现的所有情况。用线段树来维护单点修改,区间查询。
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> #include<queue> #include<set> #include<map> //#include<regex> #include<cstdio> #define up(i,a,b) for(int i=a;i<b;i++) #define dw(i,a,b) for(int i=a;i>b;i--) #define upd(i,a,b) for(int i=a;i<=b;i++) #define dwd(i,a,b) for(int i=a;i>=b;i--) //#define local typedef long long ll; const double esp = 1e-6; const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int inf = 1e9; using namespace std; ll read() { char ch = getchar(); ll x = 0, f = 1; while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } typedef pair<int, int> pir; #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lrt root<<1 #define rrt root<<1|1 const int N = 1e5 + 10; struct node { ll s, t, d, w; bool operator<(const node &a)const { return w == a.w ? d < a.d : w < a.w; }}a[N]; bool cmp(node &a, node &b) { return a.s < b.s; } void minx(ll &x, ll y) { if (y == -1)return; x = x == -1 ? y : min(x, y); } int n, m,k; ll dp[N][205]; int main() { n = read(), m = read(), k = read(); ll s, t, d, w; up(i, 0, k) { s = read(), t = read(), d = read(), w = read(); a[i] = node{ s,t,d,w }; } sort(a, a + k, cmp); memset(dp, -1, sizeof(dp)); dp[1][0] = 0; priority_queue<node>q; int cnt = 0; upd(i, 1, n) { while (cnt < k&&a[cnt].s <= i)q.push(a[cnt]),cnt++; while (!q.empty() && q.top().t < i)q.pop(); if (q.empty()) { upd(j, 0, m) minx(dp[i + 1][j], dp[i][j]); continue; } node temp = q.top(); upd(j, 0, m) { if (dp[i][j] == -1)continue; minx(dp[temp.d + 1][j], dp[i][j] + temp.w); if (j < m)minx(dp[i + 1][j + 1], dp[i][j]); } } ll ans = 1e18; upd(i, 0, m)ans = min(ans, dp[n + 1][i]); printf("%lld", max(0ll, ans)); }