[2015普及组-D]推销员 思维que

题:https://www.cometoj.com/problem/0221

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
const int M=1e5+5;
struct node{
    int len,id,a;
    bool operator<(const node &b)const{
        
        return 2*len+a<b.len*2+b.a;
    }
};
priority_queue<node>que;
int S[M];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&S[i]);
    }
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        node p;
        p.id=i;
        p.len=S[i];
        p.a=x;
        que.push(p);
    }
    int  ans=0ll,nowlen=0;;
    for(int i=1;i<=n;i++){
        node p;
        while(!que.empty()&&max(S[que.top().id]-nowlen,0)<que.top().len){
            p=que.top();
            que.pop();
            p.len=max(S[p.id]-nowlen,0);
            que.push(p);
        }
        p=que.top();
        que.pop();
        if(S[p.id]>nowlen){
            ans+=(S[p.id]-nowlen)*2;
            nowlen=S[p.id];
        }
        ans+=p.a;
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2019-09-10 13:07  starve_to_death  阅读(111)  评论(0编辑  收藏  举报