rt。用了个玄学贪心骗了 72 分(对了三个点) qwq……
大致是分类讨论前两道菜的价格情况,再贪心选择后面的菜。
不知道贪心是不是对的,就随便乱打了,如果正解不是贪心的话帮帮这个蒟蒻吧 qwq
冗长的代码 qwq:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
ll a,b,id;
}A[500005],B[500005];
ll n,ans1[500005],ans2[500005];
bool cmp1(node x,node y){
if(x.a==y.a)return x.b>y.b;
return x.a<y.a;
}
bool cmp2(node x,node y){
if(x.b==y.b)return x.a>y.a;
return x.b<y.b;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>A[i].a>>A[i].b;
A[i].id=i;
B[i].a=A[i].a,B[i].b=A[i].b,B[i].id=A[i].id;
}
sort(A+1,A+1+n,cmp1);
sort(B+1,B+1+n,cmp2);
cout<<A[1].a<<endl;
if(A[1].id!=B[1].id){
cout<<A[1].a+B[1].b<<endl;
ll ans=A[1].a+B[1].b;
for(int i=2;i<=n;i++){
if(B[i].id!=A[1].id){
ans+=B[i].b;
cout<<ans<<endl;
}
}
}else{
ans1[2]=A[1].a+B[2].b;
ans2[2]=A[2].a+B[1].b;
ll cnt1=2,cnt2=2,sum1=ans1[2],sum2=ans2[2];
for(int i=1;i<=n;i++){
if(B[i].id!=A[1].id&&B[i].id!=B[2].id){
sum1+=B[i].b;
ans1[++cnt1]=sum1;
}
}
for(int i=1;i<=n;i++){
if(B[i].id!=A[2].id&&B[i].id!=B[1].id){
sum2+=B[i].b;
ans2[++cnt2]=sum2;
}
}
for(int i=2;i<=n;i++)cout<<min(ans1[i],ans2[i])<<endl;
}
return 0;
}