Live2D

[AGC023D] Go Home 题解

题目传送门

Solution

首先排除掉特殊情况:若 \(S\) 在两侧,肯定会顺序/逆序直接走完,答案就是边界减去出发点。

考虑到若 \(P_1\geq P_n\),那么显然 \(1\) 不到家 \(n\) 就绝对不能到家,所以 \(n\) 肯定想要 \(1\) 早点到家,所以 \(n\)\(1\) 到家及以前都会和 \(1\) 统一战线,所以我们可以将两者合并继续递归。\(P_1<P_n\) 同理。

复杂度 \(\Theta(n)\)

Code

#include <bits/stdc++.h>
using namespace std;
 
#define Int register int
#define int long long
#define MAXN 100005
 
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int n,S,ans,X[MAXN],P[MAXN];

int Solveit (int l,int r){
	if (S <= X[l]) return ans += X[r] - S,X[r];
	if (S >= X[r]) return ans += S - X[l],X[l];
	if (P[l] >= P[r]){
		P[l] += P[r];int t = Solveit (l,r - 1);
		return ans += X[r] - t,X[r];
	}
	else{
		P[r] += P[l];int t = Solveit (l + 1,r);
		return ans += t - X[l],X[l];
	}
}

signed main(){
	read (n,S);
	for (Int i = 1;i <= n;++ i) read (X[i],P[i]);
    Solveit (1,n),write (ans),putchar ('\n');
	return 0;
}
posted @ 2021-06-30 21:47  Dark_Romance  阅读(76)  评论(0编辑  收藏  举报