ykmakuのブログ

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

CODE FESTIVAL 2016 qual C C - 二人のアルピニスト / Two Alpinists

  • 問題

C - 二人のアルピニスト / Two Alpinists

  • 解法

まずa_1 \neq t_nのとき答えは0になる。そうでないときを考える。t_{i-1} <  t_iのときh_i = t_iである事がわかる。このとき、a_i\le t_iでないと条件に矛盾する。同じようにa_i >  a_{i+1}のときh_i = a_iであり、このときa_i\ge t_iでないと条件に矛盾する。t_{i-1} =  t_iかつa_i =  a_{i+1}のとき山の高さは1\le h_i\le \min\{a_i,t_i\}であればなんでもよい。結局各iについて4通りの場合のどれなのかを判定して場合に応じて答えをかけ合わせていけば良い。

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <numeric>
#include <cmath>

using namespace std;

typedef long long int ll;

#define all(x) x.begin(),x.end()

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

int main()
{
	ll n;
	cin >> n;
	vector<ll> a(n),t(n);
	for(int i = 0; i < n; i++) cin >> t[i];
	for(int i = 0; i < n; i++) cin >> a[i];

	if(a[0] != t[n-1]){
		cout << 0 << endl;
	}else
	{
		ll ans = 1;
		for(int i = 1; i < n-1; i++){
			if(t[i] == t[i-1] && a[i] == a[i+1]){
				ans *= min(t[i],a[i]);
				ans %= mod;
			}else if(t[i] > t[i-1] && a[i] == a[i+1] && a[i] < t[i]){  //h[i] == t[i]
				ans = 0;
			}else if(t[i] == t[i-1] && a[i] > a[i+1] && a[i] > t[i]){  //h[i] == a[i]
				ans = 0;
			}else if(t[i] > t[i-1] && a[i] > a[i+1] && a[i] != t[i]){   //h[i] == t[i] == a[i]
				ans = 0;
			}
		}
		cout << ans << endl;
	}

	return 0;
}