题目链接
题意:给定n个物品,每个物品有三个属性ai、bi、hi(高度),当i和j满足aj<bi<=bj时i物品就可以放到j物品上面,求叠起来的最大高度。
思路:一开始想复杂了,结果是个傻逼题,我们可以给bi从大到小排序,当某个bi<底下的aj时意味着bi后面的b都不可能再叠起来了,于是就要把他们弄出来,这个过程用单调栈来维护。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
stack<int>p;
struct cxk{
int a,b;
ll w;
bool operator <(const cxk &t) const{
return b==t.b?a>t.a:b>t.b;
}
}s[maxn];
int main()
{
int n;
ll sum=0,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d %d %lld",&s[i].a,&s[i].b,&s[i].w);
sort(s+1,s+1+n);
for(int i=1;i<=n;++i)
{
while(!p.empty()&&s[p.top()].a>=s[i].b) sum-=s[p.top()].w,p.pop(),ans=max(ans,sum);
p.push(i);
sum+=s[i].w;
ans=max(ans,sum);
}
printf("%lld\n",ans);
}