分析
按好看度从大到小排序,每次选择一个尽量大的外径装入当前套娃的内径,
这样可以保证是最优的,删除选完的外径可以用平衡树实现
代码
#include <cstdio>
#include <cctype>
#include <set>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011;
multiset<int>uk;
multiset<int>::iterator it;
int l[N],r[N],rk[N],n;
long long a[N],ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
bool cmp(int x,int y){return a[x]>a[y];}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i){
r[i]=iut(),l[i]=iut(),a[i]=iut(),
rk[i]=i,uk.insert(r[i]),ans+=a[i]*l[i];
}
sort(rk+1,rk+1+n,cmp);
for (rr int i=1;i<=n;++i){
it=uk.lower_bound(l[rk[i]]);
if (it!=uk.begin()) --it,ans-=a[rk[i]]*(*it),uk.erase(it);
}
return !printf("%lld",ans);
}