Codeforces #52 (div2) B "Spoilt Permutation"

問題:http://codeforces.com/contest/56/problem/B

参加形式:本番

ある数値のリストが与えられる.このリストをある範囲で一回だけ反転させて数値のリストを昇順にできるとき,その左右端を求める.

最初から順番に見て行って,数値と一致しないインデックスから本来数値があるべきインデックスまで降順になっているかどうかをチェックする.また,そのような数列が二ヶ所以上存在する場合は一回の反転操作で昇順にできないため,そのときの処理も行う.コードは汚い.

コード

import java.util.*;

public class B_SpoiltPermutation {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		String r = "0 0";
		for (int i = 1; i <= n; ++i) {
			int a = s.nextInt();
			if (a != i) {
				if (r.equals("0 0")) {
					int b = 0, j = 1;
					for (; i + j <= a; ++j) {
						b = s.nextInt();
						if (a - j != b) {
							System.out.println("0 0");
							return;
						}
					}
					r = b + " " + a;
					i += j - 1;
				} else {
					System.out.println("0 0");
					return ;
				}
			}
		}
		System.out.println(r);
	}
}