72pts,求hack(证伪)
查看原帖
72pts,求hack(证伪)
941431
Autream楼主2024/3/25 21:21

对于前两个菜,直接枚举,以后的每一个菜的价格都是前一个菜的价格+当前没选的菜的 BiB_i 最小的价格

#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)std::cin>>a[i]
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
CI N=5e5+5;
struct node1 {
    int a,b,id;
    bool operator<(const node1& y)const {
        if(a==y.a) {
            if(b==y.b) {
                return id<y.id;
            }
            return b>y.b;
        }
        return a<y.a;
    }
}a[N];
struct node2 {
    int a,b,id;
    bool operator<(const node2& y)const {
        if(b==y.b) {
            if(a==y.a) {
                return id<y.id;
            }
            return a>y.a;
        }
        return b<y.b;
    }
}b[N];
int n,cnt=1,ans[N],vis[N];
signed main() {
    std::cin>>n;
    rep(i,1,n) {
        std::cin>>a[i].a>>a[i].b;
        b[i].a=a[i].a,b[i].b=a[i].b;
        a[i].id=i,b[i].id=i;
    }
    std::sort(arrall(a,n));
    std::sort(arrall(b,n));
    rep(i,1,n) {
        if(i==1) {
            ans[i]=a[1].a;
        } else if(i==2) {
            if(a[1].id!=b[1].id) {
                ans[i]=a[1].a+b[1].b;
                vis[a[1].id]=vis[b[1].id]=1;
            } else {
                if(a[1].a+b[2].b<a[2].a+b[1].b) {
                    ans[i]=a[1].a+b[2].b;
                    vis[a[1].id]=vis[b[2].id]=1;
                } else if(a[1].a+b[2].b>a[2].a+b[1].b) {
                    ans[i]=a[2].a+b[1].b;
                    vis[a[2].id]=vis[b[1].id]=1;
                } else {
                    ans[i]=a[2].a+b[1].b;
                    vis[a[2].id]=vis[b[1].id]=1;
                }
            }
        } else {
            while(vis[b[cnt].id]) {
                cnt++;
            }
            ans[i]=ans[i-1]+b[cnt++].b;
        }
    }
    rep(i,1,n) {
        std::cout<<ans[i]<<"\n";
    }
    return 0;
}
2024/3/25 21:21
加载中...