做练习赛的时候,想了一个十分鬼畜的贪心,尽管n2,但毫无优化的余地。
比赛结束后,zyd大神的一个贪心,按b从大到小排序,然后依次处理,找到最大的且没被找过的小于当前的in的out,更新答案。证明见zyd:https://www.zybuluo.com/Gold-7/note/236890
之后我们就可以用set来维护了。
代码:
#include<cstdio> #include<algorithm> #include<set> using namespace std; typedef long long ll; int n,k;ll ans; struct node{int in,out,b;}doll[200010]; set< pair<int,int> > st; bool cmp(const node x,const node y){return x.b>y.b;} int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d%d",&doll[i].out,&doll[i].in,&doll[i].b); sort(doll+1,doll+n+1,cmp); ll ans=0; for (int i=1;i<=n;i++) st.insert(make_pair(-doll[i].out,i)); for (int i=1;i<=n;i++) { ans+=(ll)doll[i].b*(ll)doll[i].in; set<pair<int,int> >::iterator it=st.lower_bound(make_pair(-doll[i].in,n+1)); if (it==st.end()) k=0;else k=(*it).second; if (k){ans-=(ll)doll[k].out*(ll)doll[i].b;st.erase(it);} } printf("%lld\n",ans); }