12
9
2015
0

【JSOI2015】套娃

做练习赛的时候,想了一个十分鬼畜的贪心,尽管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);
}
Category: 贪心 | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com