codeforces-777E Hanoi Factory
题目大意:
现在一共有N个零件,如果存在:bi>=bj&&bj>ai的两个零件i,j,那么此时我们就可以将零件j放在零件i上。我们现在要组成一个大零件,使得高度最高,问这个最高高度。
n2 dp的优化,树状数组维护前缀max(当修改一直变大,或一直变小可以用树状数组维护;一开始看错成bi>bj.......
注意b相同时,a也要排序,小的要在前兜住更多的盘
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<string>
using namespace std;
int n;
int m;
long long tr[100005];
struct node
{
long long a,b,h;
}itm[100005];
bool cmp(node x,node y)
{
if(x.b!=y.b)
return x.b<y.b;
else
return x.a<y.a;
}
int lb(int x)
{
return x&(-x);
}
void add(int x,long long val)
{
while(x<=m)
{
tr[x]=max(tr[x],val);
x+=lb(x);
}
}
long long gt(int x)
{
long long ans=0;
while(x>0)
{
ans=max(ans,tr[x]);
x-=lb(x);
}
return ans;
}
long long b[100005];
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<=100000;i++)
tr[i]=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&itm[i].a,&itm[i].b,&itm[i].h);
}
sort(itm+1,itm+1+n,cmp);
m=n;
/*for(int i=2;i<=n;i++)
{
if(itm[i].b>itm[i-1].b)
{
m++;
itm[m]=itm[i];
}
else
{
itm[m].a=min(itm[m].a,itm[i].a);
}
}*/
for(int i=1;i<=m;i++)
{
b[i]=itm[i].b;
}
long long ans=0;
for(int i=1;i<=m;i++)
{
int a=itm[i].a;
int id=upper_bound(b+1,b+1+m,a)-(b);
long long pmax=gt(m+1-id);
//cout<<id<<":"<<pmax<<":"<<itm[i].h<<endl;
ans=max(ans,pmax+itm[i].h);
add(m+1-i,pmax+itm[i].h);
}
printf("%lld\n",ans);
}
}