Codeforces Round 865 (Div. 2) - C. Ian and Array Sorting (1300)
내 풀이Permalink
오른쪽으로 한번 갔다가 왼쪽으로 한번 돌아오며 만들 수 있는지를 검사한다.
부터 시작일 때 까지 보며 이라면 를 와 에 더해준다.
반대도 유사하게 한다.
이 과정에서 non-decreasing array를 만들 수 있다면 YES이다.
그냥 직관으로 풀었다.
void solve() {
int n;
cin >> n;
vi a(n);
fv(a);
for (int i = 1; i < n - 1; i++) {
if (a[i] >= a[i - 1]) continue;
int d = a[i - 1] - a[i];
a[i] += d;
a[i + 1] += d;
}
if (a[n - 1] >= a[n - 2]) {
cout << "YES\n";
} else {
for (int i = n - 2; i >= 1; i--) {
if (a[i] <= a[i + 1]) continue;
int d = a[i] - a[i + 1];
a[i] -= d;
a[i - 1] -= d;
}
if (a[0] <= a[1]) {
cout << "YES\n";
} else cout << "NO\n";
}
}
에디토리얼 풀이Permalink
를 고려한다.
non-decreasing array라면 이 값들이 모두 이상이다.
을 고려한다.
을 증가시키면 은 감소하고 는 증가한다.
감소시키면 반대이다.
의 합을 고려한다.
이 짝수이고 의 합이 음수인 경우만 NO 이다.
이 홀수라면 가령
a=5 4 3 2 1
여서 b=-1 -1 -1 -1
라 하자.
우린 이나 을 무한히 증가시킬 수 있다.
를 계속 더하거나 을 계속 빼면 된다.
따라서 을 에서 계속 같은 parity에 대해 전파시킬 수 있어서 모두 이상이 되게 할 수 있다.
이 짝수라면 다음과 같은데,
,
중앙의 은 여전히 무한히 증가시킬 수 있지만, 나머지 은 을 해줘도 합이 항상 일정해서 제일 처음에 이상이지 않으면 불가능하다.
그렇지 않으면 항상 일련의 연산을 통해 모두 값을 분배시켜줄 수 있다.
void solve() {
int n;
cin >> n;
vi a(n);
fv(a);
if (n % 2 == 1) {
cout << "YES\n";
} else {
int sum = 0;
for (int i = 1; i < n; i += 2) sum += a[i] - a[i - 1];
if (sum >= 0) cout << "YES\n";
else cout << "NO\n";
}
}
Comments