Description
Analysis
显然对于Bi大的填越满越好
所以排个序
所以用一棵权值线段树记录一下选哪一个
这样贪心显然是对的
Code
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int N=200005,M=6200005,INF=1e9;
struct node
{
ll i,o,x;
}a[N];
ll ans;
int n,tot,root,tr[M],ls[M],rs[M];
bool cmp(node a,node b)
{
return a.x>b.x;
}
void change(int &v,int l,int r,int x,int y)
{
if(!v) v=++tot;
if(l==r)
{
tr[v]+=y;
return;
}
int mid=(l+r)>>1;
if(x<=mid) change(ls[v],l,mid,x,y);
else change(rs[v],mid+1,r,x,y);
tr[v]=max(tr[ls[v]],tr[rs[v]]);
}
int find(int v,int l,int r,int x)
{
if(x<l) return 0;
if(!tr[v]) return 0;
if(l==r) return l;
int mid=(l+r)>>1;
if(x<=mid) return find(ls[v],l,mid,x);
else
{
int t=find(rs[v],mid+1,r,x);
if(!t) t=find(ls[v],l,mid,x);
return t;
}
}
int main()
{
freopen("doll.in","r",stdin);
freopen("doll.out","w",stdout);
scanf("%d",&n);
fo(i,1,n)
{
scanf("%lld %lld %lld",&a[i].o,&a[i].i,&a[i].x);
change(root,1,INF,a[i].o,1);
ans+=a[i].x*a[i].i;
}
sort(a+1,a+n+1,cmp);
fo(i,1,n)
{
int t=find(root,1,INF,a[i].i-1);
if(t) ans-=t*a[i].x;
change(root,1,INF,t,-1);
}
printf("%lld",ans);
return 0;
}