囧,一开始看错题意,后来才发现人是垂直下落的,被附带链接里的Man Down游戏误导了。
那就变成了一个简单的DAG模型动态规划,随意搞就ok了
#include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <queue> #include <deque> #include <bitset> #include <list> #include <cstdlib> #include <climits> #include <cmath> #include <ctime> #include <algorithm> #include <stack> #include <sstream> #include <numeric> #include <fstream> #include <functional> using namespace std; #define MP make_pair #define PB push_back #define lson rt << 1,l,mid #define rson rt << 1 | 1,mid + 1,r typedef long long LL; typedef unsigned long long ULL; typedef vector<int> VI; typedef pair<int,int> pii; const int INF = INT_MAX / 3; const double eps = 1e-8; const LL LINF = 1e17; const double DINF = 1e60; const int maxn = 1e5 + 10; struct Plank { int h,l,r,power; Plank(int h,int l,int r,int power): h(h),l(l),r(r),power(power) {} bool operator < (const Plank &p) const { return h < p.h; } }; vector<Plank> plank; int n,Val[maxn << 2],lazy[maxn << 2]; LL f[maxn]; void pushdown(int rt) { if(lazy[rt] == -1) return; Val[rt << 1] = Val[rt << 1 | 1] = lazy[rt << 1] = lazy[rt << 1 | 1] = lazy[rt]; lazy[rt] = -1; } void update(int rt,int l,int r,int ql,int qr,int v) { if(ql <= l && qr >= r) { Val[rt] = v; lazy[rt] = v; } else { int mid = (l + r) >> 1; pushdown(rt); if(ql <= mid) update(lson,ql,qr,v); if(qr > mid) update(rson,ql,qr,v); } } int query(int rt,int l,int r,int pos) { if(l == r) return Val[rt]; pushdown(rt); int mid = (l + r) >> 1; if(pos <= mid) return query(lson,pos); else return query(rson,pos); } int main() { int h,l,r,power,rb; while(scanf("%d",&n) != EOF) { plank.clear(); rb = -1; memset(f,0,sizeof(f)); memset(lazy,-1,sizeof(lazy)); for(int i = 0;i < n;i++) { scanf("%d%d%d%d",&h,&l,&r,&power); plank.PB(Plank(h,l,r,power)); rb = max(rb,r); } plank.PB(Plank(0,1,rb,0)); sort(plank.begin(),plank.end()); update(1,1,rb,1,rb,0); for(int i = 1;i <= n;i++) { int xl = query(1,1,rb,plank[i].l), xr = query(1,1,rb,plank[i].r); f[i] = max(f[xl],f[xr]) + plank[i].power; update(1,1,rb,plank[i].l,plank[i].r,i); } LL ans = f[n] + 100; ans = max(ans,-1LL); cout << ans << endl; } return 0; }