首页 > 其他分享 >P5902 [IOI2009] salesman 题解

P5902 [IOI2009] salesman 题解

时间:2023-02-18 15:46:20浏览次数:60  
标签:P5902 return int 题解 long res salesman define

题目链接

题意

船向上游移动 1 米花费 \(U\) 元,向下移动 1 米花费 \(D\) 元。

沿河有 \(N\) 个展销会,对于第 \(i\) 个展销会,它的日期为 \(T_i\),它的位置为 \(L_i\),可获得盈利 \(M_i\) 元。

一个需要从位置 \(S\) 开始和结束他的旅程。

求它能得到的最大盈利。

题解

直接暴力是 \(O(N^3)\) 的。

一开始先排序一下。设 \(f(i)\) 表示前 \(i\) 个展销会,终点是 \(i\)。

如果不考虑同一天,那么只要枚举转移时从哪一天:

\[f(i)=\max_{j=0}^i\{f(j)-(L_i-L_j)\cdot U\}+w_i \]

还有一种往下走的要考虑。

代码

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define rep(i,n) for(int i=0;i<n;i++)
#define rept(i,n) for(int i=1;i<=n;i++)
#define repe(i,l,r) for(int i=l;i<=r;i++)
#define FOR(i,r,l) for(int i=r;i>=l;i--)
#define fi first
#define se second
#define pii pair<int,int>
#define mpr make_pair
#define pb push_back
#define sz(v) (int)(v.size())
using namespace std;
int fast(int a,int b,int P){int res=1;if(P<=0){while(b){if(b&1)res=res*a;a=a*a;b>>=1;}}else{while(b){if(b&1)res=res*a%P;a=a*a%P;b>>=1;}}return res;}
template<typename T>void chmax(T& a,T b){if(a<b)a=b;return;}
template<typename T>void chmin(T& a,T b){if(a>b)a=b;return;}
const int N=5e5+10;
int n,u,d,s,dp[N],tol[N],tor[N];
struct node{
	int t,l,w;
	bool operator<(const node &x)const{
		if(t!=x.t){
			return t<x.t;
		}
		return l<x.l;
	}
}a[N];
int tree1[N],tree2[N];
int lowbit(int x){
	return x&(-x);
}
void update1(int x,int v){
	while(x<N){
		chmax(tree1[x],v);
		x+=lowbit(x);
	}
}
int query1(int x){
	int res=-0x3f3f3f3f3f3f3f3f;
	while(x>0){
		chmax(res,tree1[x]);
		x-=lowbit(x);
	}
	return res;
}
void update2(int x,int v){
	while(x>0){
		chmax(tree2[x],v);
		x-=lowbit(x);
	}
}
int query2(int x){
	int res=-0x3f3f3f3f3f3f3f3f;
	while(x<N){
		chmax(res,tree2[x]);
		x+=lowbit(x);
	}
	return res;
}
void solve(int l,int r){
	repe(i,l,r){
		tol[i]=tor[i]=max(query1(a[i].l)-a[i].l*d,query2(a[i].l)+a[i].l*u)+a[i].w;
	}
	repe(i,l+1,r){
		chmax(tol[i],tol[i-1]-(a[i].l-a[i-1].l)*d+a[i].w);
	}
	FOR(i,r-1,l){
		chmax(tor[i],tor[i+1]-(a[i+1].l-a[i].l)*u+a[i].w);
	}
	repe(i,l,r){
		dp[i]=max(tol[i],tor[i]);
		update1(a[i].l,dp[i]+a[i].l*d);
		update2(a[i].l,dp[i]-a[i].l*u);
	}
}
signed main(){
	memset(tree1,-0x3f,sizeof(tree1));
	memset(tree2,-0x3f,sizeof(tree2));
	memset(dp,-0x3f,sizeof(dp));
	scanf("%lld%lld%lld%lld",&n,&u,&d,&s);
	rept(i,n){
		scanf("%lld%lld%lld",&a[i].t,&a[i].l,&a[i].w);
	}
	a[n+1].t=0x3f3f3f3f3f3f3f3f;
	a[0].l=a[n+1].l=s;
	sort(a+1,a+1+n);
	dp[0]=0;
	update1(s,s*d);
	update2(s,-s*u);
	rept(i,n+1){
		if(a[i].t==a[i+1].t){
			int tmp=i;
			while(a[i].t==a[i+1].t){
				i++;
			}
			solve(tmp,i);
			continue;
		}
		dp[i]=max(query1(a[i].l)-a[i].l*d,query2(a[i].l)+a[i].l*u)+a[i].w;
		update1(a[i].l,dp[i]+a[i].l*d);
		update2(a[i].l,dp[i]-a[i].l*u);
	}
	printf("%lld\n",dp[n+1]);
	return 0;
}
//Jerry_Jiang

标签:P5902,return,int,题解,long,res,salesman,define
From: https://www.cnblogs.com/Jerry-Jiang/p/P5902.html

相关文章

  • YACS 2023年2月月赛 甲组 T1 自由贸易 题解
    题目链接上来一看题和数据范围基本就是DP了,问题是状态怎么设计呢?如果我们仅仅设$f[i]$为到第$i$个水果时的最大分数,那么显然会发现无法处理当前水果的分数贡献。......
  • ARC111C Too Heavy 题解
    无解的情况:当且仅当一个人手上的物品不是自己的物品,并且这个物品的质量大于自己的体重,这个不是自己的东西就卡手了,换不出去,无解。甲手上是乙的物品。乙的手上是丙的物品,丙......
  • NOIP2022 简要题解
    前言作为一名退役OIer,借着此比赛来复健。大部分题目都是口胡(没啥好写的),spj题手写了代码,A了。难度不算特别高,但是赛场上拿到高分略有压力(退役了可以瞎bb)。个人认为应该......
  • 题解 CF690C2
    题目大意:给你一棵树,求一下直径题目分析:emm,怎么说吧,就是树的直径的裸板子。可能有人不大理解,明明是图,你为什么要说是给定一棵树。大家可以自行验证一下,满足如下两个性......
  • 题解 CF690C1
    题目大意:给定一张\(n\)个点\(m\)条边的无向图,判断这是不是一棵树。题目分析:两种思路:思路一:不需要建图,直接使用并查集判环即可最后判断一下图联不联通就行,具体方......
  • 一个autoreconf的报错问题解决
    报错如下configure.ac:36:error:possiblyundefinedmacro:AC_CHECK_LIBIfthistokenandothersarelegitimate,pleaseusem4_pattern_allow.Seet......
  • 题解 CF637B
    题目大意:维护个栈,去重保留最上层题目分析:啥也不是,数组模拟\(\text{stack}+\text{unordered\_map}\)直接秒掉。复杂度\(O(n)\)代码实现:#include<bits/stdc++.h>......
  • 题解 CF742B
    题目大意:给定\(n\)个数,找数对使其异或值为\(k\),求满足这样数对的个数。题目分析:考验位运算功底的题目(实际上也不是很难),主要运用到了下列性质:\[\begin{aligned}\bec......
  • 20230207模拟赛题解
    A-CF755D考虑每次加边产生的贡献。发现每次加边的贡献是这条边与别的边的交点数量加\(1\)。所以可以用线段树或树状数组等数据结构维护,注意要令\(k=\min(k,n-k)\)。B-......
  • CAD坐标显示不全怎么办?CAD坐标常见问题解答!
    今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和......