标签:
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