ykmakuのブログ

競技プログラミングをがんばるブログ

AtCoder Grand Contest 017 B - Moderate Differences

  • 問題

B - Moderate Differences

  • 解法

Y_i = X_{i+1} - X_i \ (1\le i \le N-1)とすると\sum_{i=1}^{N-1} Y_i = B - Aとなる。ここでY_iに関して、C \le Y_i \le Dまたは-D \le Y_i \le -Cが成立する。N-1個のうち前者の個数がi個だったとするとこのとき条件を満たすにはiC-(N-1-i)D\le B-A\le iD-(N-1-i)Cである必要がある。逆にこれが成立する時、条件を満たすように数列を作ることができる。iC-(N-1-i)D\le B-A\le iD-(N-1-i)Cであるかどうかの判定は\mathcal{O}(1)でできるので全体として\mathcal{O}(N)の時間計算量で答えを求められる。

#include <iostream>
using namespace std;

typedef long long int ll;

const ll mod = 1e9+7;
const ll INF = 1e9;
const ll MAXN = 1e9;

int main()
{
	ll n,a,b,c,d;
	cin >> n >> a >> b >> c >> d;
	bool flag = false;
	for(int i = 0; i < n; i++){
		ll l = i*c-(n-1-i)*d, r = i*d-(n-1-i)*c;
		if(l<= b-a && b-a <= r) flag = true;
	}

	if(flag) cout << "YES" << endl;
	else cout << "NO" << endl;

	return 0;
}