C. Ian and Array Sorting

내 풀이Permalink

오른쪽으로 한번 갔다가 왼쪽으로 한번 돌아오며 만들 수 있는지를 검사한다.

i=0i=0 부터 시작일 때 i1n2i \coloneqq 1 \to n-2 까지 보며 ai<ai1a_i < a_{i-1} 이라면 d=ai1aid=a_{i-1}-a_iaia_iai+1a_{i+1} 에 더해준다.

반대도 유사하게 한다.

이 과정에서 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

a2a1,a3a2,a_2-a_1, a_3-a_2, \dots 를 고려한다.

non-decreasing array라면 이 값들이 모두 00 이상이다.

bi=ai+1ai (0i<n1)b_i=a_{i+1}-a_i ~ (0 \le i <n-1) 을 고려한다.

ai,ai+1a_i, a_{i+1}11 증가시키면 bib_i11 감소하고 bi+2b_{i+2}11 증가한다.

11 감소시키면 반대이다.

bb 의 합을 고려한다.

nn이 짝수이고 bb의 합이 음수인 경우만 NO 이다.

nn이 홀수라면 가령

a=5 4 3 2 1

여서 b=-1 -1 -1 -1라 하자.

우린 b2b_2 이나 bn2b_{n-2} 을 무한히 증가시킬 수 있다.

a1,a2a_1, a_2 를 계속 더하거나 an1,ana_{n-1}, a_n 을 계속 빼면 된다.

따라서 +1,1+1, -1bb 에서 계속 같은 parity에 대해 전파시킬 수 있어서 모두 00 이상이 되게 할 수 있다.

nn 이 짝수라면 다음과 같은데,

a=2,1,4,3a=2,1,4,3 , b=1,3,1b=-1,3,-1

중앙의 33 은 여전히 무한히 증가시킬 수 있지만, 나머지 1,1-1, -1+1,1+1, -1 을 해줘도 합이 항상 일정해서 제일 처음에 00 이상이지 않으면 불가능하다.

그렇지 않으면 항상 일련의 연산을 통해 모두 값을 분배시켜줄 수 있다.

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