专栏文章

P13507 [OOI 2024] Three Arrays 题解

P13507题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minrqxp2
此快照首次捕获于
2025/12/02 07:17
3 个月前
此快照最后确认于
2025/12/02 07:17
3 个月前
查看原文
首先考虑 Di=0D_i=0 怎么做。
不妨令 L0=a0L_0=a_0R0=b0R_0=b_0。设 An=LiL0A_n=L_i \le L_0,那么显然 BnB_n 所能取到的最大值为:
min(R0,minLj<LiRj)\min(R_0,\min_{L_j \lt L_i} R_j)
按照 LiL_i 从小到大的顺序计算即可。
接下来考虑不保证 Di=0D_i=0 怎么做。
显然最终的 AnA_n 形如 Li+Di+1++DnL_i+D_{i+1}+\dots+D_nBnB_n 形如 Rj+Dj+1++DnR_j+D_{j+1}+\dots+D_n,所以我们可以把 LiL_i 直接看作 Li+Di+1++DnL_i+D_{i+1}+\dots+D_n,把 RjR_j 直接看作 Rj+Dj+1++DnR_j+D_{j+1}+\dots+D_n,这样就转化成了 Di=0D_i=0 的情况,同上述方法计算即可。
时间复杂度 O(nlogn)\mathcal O(n \log n)
C
const int N=1e5+5;
int n,d[N];
pair <ll,ll> p[N];
ll suf[N],l[N],r[N],mi,ans=0;
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>d[i];
	for(int i=n;i>=1;i--) suf[i]=suf[i+1]+d[i];
	for(int i=1;i<=n;i++) cin>>l[i],l[i]+=suf[i+1];
	for(int i=1;i<=n;i++) cin>>r[i],r[i]+=suf[i+1];
	cin>>l[0]>>r[0],l[0]+=suf[1],r[0]+=suf[1],mi=r[0];
	for(int i=0;i<=n;i++) p[i]={l[i],-r[i]};
	sort(p,p+n+1);
	for(int i=0;i<=n;i++){
		if(p[i].fi>l[0]) break;
		ans=max(ans,p[i].fi+mi);
		mi=min(mi,-p[i].se);
	}
	cout<<ans<<endl;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...