[IOI2009]salesman
CI.[IOI2009]salesman
思想非常simple:因为一次从上游往下游的转移,可以被表示成
拆开括号,即可得到两半互不相关的部分。然后直接使用线段树/树状数组进行转移即可。
从下游往上游的转移也可以类似地处理。
现在考虑中可能有相等的情形,并不能确定访问顺序。这个再使用一遍辅助DP过一遍就行了。有一个结论是当相等时,一次转移中一定不会走回头路——回头路的部分完全可以在上次转移和下次转移处就处理掉了。然后就直接DP过就行了。
3min就能想出的idea,我整整调了3d。主要因为一开始套了两重离散化,后来发现数据范围开的下便删去了离散化;一开始写的是线段树,后来发现线段树debug起来很麻烦,便换成了BIT;一开始也没有想到没有回头路的情形,辅助DP时写的极其憋屈(后来证明就是这个憋屈的DP中有一处和写反了);同时中文题面翻译还翻译错了,这个“距离”是到上游的距离而非到下游的距离。于是种种因素叠加在一起,debug得精神崩溃。
代码:
#include<bits/stdc++.h>
using namespace std;
const int inf=0xc0c0c0c0;
const int N=1001000;
int n,U,D,S,tim[N],pos[N],bon[N],m=500100,ord[N],f[N],g[N],upper[N],lower[N];//upper:the maximal when go against the wave; lower:vice versa
void modify(int P,int val){
for(int x=P;x;x-=x&-x)upper[x]=max(upper[x],val-P*U);
for(int x=P;x<=m;x+=x&-x)lower[x]=max(lower[x],val+P*D);
}
int queryupper(int P){
int ret=inf;
for(int x=P;x<=m;x+=x&-x)ret=max(ret,upper[x]+P*U);
return ret;
}
int querylower(int P){
int ret=inf;
for(int x=P;x;x-=x&-x)ret=max(ret,lower[x]-P*D);
return ret;
}
#define I ord[i]
#define J ord[j]
#define K ord[k]
int main(){
scanf("%d%d%d%d",&n,&U,&D,&S),memset(upper,0xc0,sizeof(upper)),memset(lower,0xc0,sizeof(lower));
for(int i=1;i<=n;i++)scanf("%d%d%d",&tim[i],&pos[i],&bon[i]),ord[i]=i;
sort(ord+1,ord+n+1,[](int x,int y){return tim[x]==tim[y]?pos[x]<pos[y]:tim[x]<tim[y];});
modify(S,0);
for(int i=1,j=1;j<=n;){
while(tim[I]==tim[J])f[J]=g[J]=max(queryupper(pos[J]),querylower(pos[J]))+bon[J],j++;
for(int k=i+1;k<j;k++)f[K]=max(f[K],f[ord[k-1]]-(pos[K]-pos[ord[k-1]])*D+bon[K]);
for(int k=j-2;k>=i;k--)g[K]=max(g[K],g[ord[k+1]]-(pos[ord[k+1]]-pos[K])*U+bon[K]);
while(i<j)modify(pos[I],max(f[I],g[I])),i++;
}
printf("%d\n",max(queryupper(S),querylower(S)));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?