标签:
Description
Input
Output
Sample Input
Sample Output
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[100005]; struct p1 { int h,l,r,v; int lv,rv; };p1 s[100005]; bool com(p1 a,p1 b) { return a.h<b.h; } struct p2 { int l,r,v; };p2 tree[1000000]; void build(int l,int r,int p) { tree[p].l=l;tree[p].r=r; tree[p].v=0; if (l==r) return ; int m=(l+r)/2; build(l,m,p*2); build(m+1,r,p*2+1); } void un(int l,int r,int p,int x) { if (tree[p].l==l&&tree[p].r==r) { tree[p].v=x; return ; } if (tree[p].v!=-1) { tree[p*2].v=tree[p*2+1].v=tree[p].v; tree[p].v=-1; } int m=(tree[p].l+tree[p].r)/2; if (l>m) un(l,r,p*2+1,x); else if (m>=r) un(l,r,p*2,x); else { un(l,m,p*2,x); un(m+1,r,p*2+1,x); } } int find(int x,int p) { if (tree[p].v!=-1) return tree[p].v; int m=(tree[p].l+tree[p].r)/2; if (x<=m) return find(x,p*2); return find(x,p*2+1); } int main() { int n,i,mx; while (~scanf("%d",&n)) { mx=-1; for (i=1;i<=n;i++) { scanf("%d%d%d%d",&s[i].h,&s[i].l,&s[i].r,&s[i].v); if (mx<s[i].r) mx=s[i].r; } build(1,mx,1); memset(dp,0,sizeof(dp)); sort(s+1,s+n+1,com); for (i=1;i<=n;i++) { s[i].lv=find(s[i].l,1); s[i].rv=find(s[i].r,1); un(s[i].l,s[i].r,1,i); } s[0].v=0; dp[n]=100+s[n].v; for (i=n;i>0;i--) { if (dp[i]<=0) continue; dp[s[i].lv]=max(dp[s[i].lv],dp[i]+s[s[i].lv].v); dp[s[i].rv]=max(dp[s[i].rv],dp[i]+s[s[i].rv].v); } if (dp[0]<=0) printf("-1\n"); else printf("%d\n",dp[0]); } }
标签:
原文地址:http://www.cnblogs.com/pblr/p/4747866.html