Bzoj3352 [ioi2009]旅行商
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 89 Solved: 36
Description
Input
Output
Sample Input
2 80 100
20 125 130
10 75 150
5 120 110
Sample Output
HINT
Source
动态规划 线性dp 线段树优化
设 $f[i][j]$ 表示第 i 天停在j号展会位置时的最大收益。
显然有 $ f[i][j] = max{f[i-1][k] * cost(k,j)}+ w[j] $
注意到天数和展会数同级,可以认为多数展会不在同一天,这时可以把第一维i丢掉。
丢掉以后空间够了,时间复杂度还是太高啊?
我们把cost展开,当顺流而下的时候,假设向i转移的时候,j位置比k位置优,有:
$$ f[j] - (L_i-L_j) * D > f[k] - (L_i-L_k) * D $$
$$ f[j]+L_j*D > f[k] + L_k*D $$
把$ f[j]+L_j*D $ 丢进线段树里,维护区间最大值即可$O(logn)$查询。
逆流而上同理。
当一些展会挤在同一天的时候怎么处理?
撕烤一下可以发现同一天经过的展会一定是一个连续的区间(从一点到另一点的时候如果中途经过别的展会,不拿白不拿)。
对于每一个终点,分类讨论起点在上游还是下游,枚举起点找最大收益,这样显然是正确的。
维护two-pointers或者前缀最大值即可快速转移。
78行的初始化边界没有加,WA*2
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int INF=0x3f3f3f3f;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,D,U,S;
struct met{
int day,x;
int w;
bool operator < (const met &b)const{
return (day==b.day && x<b.x) || day<b.day;
}
}a[mxn];
int f[mxn];
int tmp[mxn],tmp2[mxn];
//
struct node{
int mxu,mxd;
}t[mxn<<];
#define ls rt<<1
#define rs rt<<1|1
inline void pushup(int rt){
t[rt].mxd=max(t[ls].mxd,t[rs].mxd);
t[rt].mxu=max(t[ls].mxu,t[rs].mxu);
return;
}
void Build(int l,int r,int rt){
if(l==r){t[rt].mxd=t[rt].mxu=-INF;return;}
int mid=(l+r)>>;
Build(l,mid,ls);Build(mid+,r,rs);
pushup(rt);
return;
}
void update(int p,int l,int r,int rt){
if(l==r){
t[rt].mxd=f[p]+a[p].x*D; t[rt].mxu=f[p]-a[p].x*U;
return;
}
int mid=(l+r)>>;
if(a[p].x<=mid)update(p,l,mid,ls);
else update(p,mid+,r,rs);
pushup(rt);
return;
}
//
int MXU,MXD;
void query(int L,int R,int l,int r,int rt){
if(L<=l && r<=R){
MXD=max(t[rt].mxd,MXD);MXU=max(t[rt].mxu,MXU);
return;
}
int mid=(l+r)>>;
if(L<=mid)query(L,R,l,mid,ls);
if(R>mid)query(L,R,mid+,r,rs);
return;
}
void solve(){
Build(,m,);
update(,,m,);
for(int i=,j;i<=n;i=j+){
for(j=i;a[j].day==a[i].day;j++){
f[j]=-INF;
MXU=-INF; query(a[j].x,m,,m,);
f[j]=max(f[j],MXU+a[j].x*U);
MXD=-INF; query(,a[j].x,,m,);
f[j]=max(f[j],MXD-a[j].x*D);
f[j]+=a[j].w;
}j--;
tmp[i]=f[i];tmp2[j]=f[j];
for(int k=i+;k<=j;k++)
tmp[k]=max(f[k],tmp[k-]-(a[k].x-a[k-].x)*D+a[k].w);
for(int k=j-;k>=i;k--)
tmp2[k]=max(f[k],tmp2[k+]-(a[k+].x-a[k].x)*U+a[k].w);
for(int k=i;k<=j;k++){
f[k]=max(f[k],max(tmp[k],tmp2[k]));
update(k,,m,);
}
}
printf("%d\n",f[n]);
return;
}
int main(){
int i,j;
n=read();
U=read();D=read();
S=read();
a[]=(met){,S,};n++;
for(i=;i<=n;i++){
a[i].day=read();a[i].x=read();a[i].w=read();
m=max(m,a[i].x);
}
sort(a+,a+n+);++n;
a[n]=(met){a[n-].day+,S,};
m=max(m,S);
solve();
return ;
}
Bzoj3352 [ioi2009]旅行商的更多相关文章
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- 2016全国研究生数学建模A题多无人机协同任务规划——基于分布式协同多旅行商MTSP遗传算法
MTSP问题是指:有Ⅳ个城市,要求旅行商到达每个城市各一次,且仅一次,并[旦 1到起点,且要求旅行路线最短.而多旅行商问题M个旅行商从同一个城市(或多个城市)出发.分羽走一条旅路线,且总路程缀短.有关 ...
- [vijos P1014] 旅行商简化版
昨天早上上课讲旅行商问题,有点难,这周抽空把3^n的算法码码看.不过这个简化版已经够折腾人了. 其一不看解析不知道这是双进程动态规划,不过我看的解析停留在f[i,j]表示第一个人走到i.第二个人走到j ...
- vijosP1014 旅行商简化版
vijosP1014 旅行商简化版 链接:https://vijos.org/p/1014 [思路] 双线DP. 设ab,ab同时走.用d[i][j]表示ab所处结点i.j,且定义i>j,则有转 ...
- 洛谷【P1523】旅行商的背包(算法导论 15-1) 题解
P1523 旅行商简化版 题目背景 欧几里德旅行商\((Euclidean Traveling Salesman)\)问题也就是货郎担问题一直是困扰全世界数学家.计算机学家的著名问题.现有的算法都没有 ...
- hdu 4281 Judges' response(多旅行商&DP)
Judges' response Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 旅行商(sale)
旅行商(sale) 题目描述 camp国有n座城市,由1,2,-,n编号.城市由n–1条双向道路相连.任意两个城市之间存在唯一的道路连通.有m个旅行商,第i个旅行商会从城市ai旅行到城市bi,贩卖ci ...
- 洛谷P1523 旅行商简化版(DP)
题目: P1523 旅行商简化版 解析 可以看做是两个人同时从西往东走,经过不一样的点,走到最东头的方案数 设\(f[i][j]\)表示一个人走到i,一个人走到j的最短距离(\(i<j\)) 第 ...
随机推荐
- 第八周PSP&进度条
团队项目PSP 一.表格: C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论各个模块页面设计 9:30 12:30 站立会议 分配 ...
- java杂项
简单介绍==和equals区别==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同 final, finally, finalize的区别fi ...
- RFC 8446
https://tools.ietf.org/html/rfc8446#section-2.3 简要内容.. [Docs] [txt|pdf] [draft-ietf-tls-...] [Tracke ...
- MyFlash闪回恢复数据
使用限制: .binlog格式必须为row,且binlog_row_image=full. .仅支持5.6与5.. .只能回滚DML(增.删.改). .mysqlbinlog版本请保持一致. 1.安装 ...
- BZOJ2878 NOI2012迷失游乐园(树形dp+环套树+概率期望)
考虑树的部分分怎么做.令f[i]为i向子树内走的期望路径长度,转移比较显然.算答案时先把其父亲的答案弄好就可以统计自己的答案了. 环套树也类似.树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在 ...
- Oracle 双字段过滤
白名单:数据 id , g_id,sys_id 1,2,3 1,2,4 黑名单:数据 id , g_id,sys_id b,2,3 结果 1,2,4 select t1.* ...
- BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】
题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...
- Windows Shell远程执行代码漏洞((CVE-2018-8414)复现
0x00 SettingContent-ms文件介绍 .SettingContent-ms是在Windows 10中引入的一种文件类型,它的内容是XML格式进行编写的,主要用于创建Windows设 ...
- ListView嵌套webView 事件冲突解决
如图,红色部分为WebView,作为ListView头部存在,测试视频(h5)要左右滑动,ListView要上下滑动,保证视频控件和下面评论部分可以显示,但是这个时候就存在WebView横向滑动和Li ...
- 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件
解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题 http://marller.blog.51cto.com/8699646/1762028 FAQ: Surf ...