[NOIP2015 普及组] 推销员题解
题型考察
此题的数据范围提示时间复杂度 为
思路
很明显对于每个
所谓问题递进就是在
记录当前取得最大值的住户为
考虑到
当
当
如果要求答案最大,则
当
当
利用优先队列维护即可。
当
当
上述过程考场上不用严格证明,手推样例即可领悟。
细节方面判断要特殊处理队空的情况。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,ans,bpos,ansL;
int s[N],a[N];
struct node {
int pos,val;
friend bool operator < (node x,node y) {
return x.val<y.val;
}
}qwq,ansR;
priority_queue<int>q1;
priority_queue<node>q2;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) {
qwq.pos=i;
qwq.val=2*s[i]+a[i];
q2.push(qwq);
}
for(int i=1;i<=n;i++) {
ansL=ansR.val=0;
if(!q1.empty()) ansL=q1.top();
while(!q2.empty()&&q2.top().pos<=bpos) q2.pop();
if(!q2.empty()) ansR=q2.top();
if(ansL<ansR.val-2*s[bpos]) {
ans+=ansR.val-2*s[bpos];
for(int j=bpos+1;j<=ansR.pos-1;j++) q1.push(a[j]);
bpos=ansR.pos;
q2.pop();
}
else {
ans+=ansL;
q1.pop();
}
cout<<ans<<endl;
}
return 0;
}
本文作者:2021hych
本文链接:https://www.cnblogs.com/2021hych/p/16508138.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步