kmjp's blog

競技プログラミング参加記です

Bubble Cup 8 Final : F. Bulbo

ややこしいけどコードは短い。
http://codeforces.com/contest/575/problem/F

問題

初期状態でプレイヤーは1次元座標軸の位置Xにいる。
N個の区間[L[i],R[i]]が与えられる。
プレイヤーはその都度各区間の中に含まれるよう移動しなければならない。
最小の総移動量を求めよ。

解法

各区間に入る時点の最小移動量と、その移動量でプレイヤーが要られる区間[l,r]を適宜更新していく。
今いる[l,r]に対し次の区間がその外側にあるなら、最寄りの位置から移動するようにしていくと良い。

int N,X;
ll L[5050],R[5050];

ll CL,CR;
ll tot;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N>>X;
	CL=CR=X;
	FOR(i,N) {
		cin>>L[i]>>R[i];
		if(CR<=L[i]) {
			tot += L[i]-CR;
			CL=CR;
			CR=L[i];
		}
		else if(R[i]<=CL) {
			tot += CL-R[i];
			CR=CL;
			CL=R[i];
		}
		else {
			CL=max(CL,L[i]);
			CR=min(CR,R[i]);
		}
	}
	cout<<tot<<endl;
}

まとめ

シンプルだけど良い問題。