[Boj_22963] 3์ด ์ ๋ ฌ
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/22963
โธ ๋ฌธ์
์ง๊ธ ์ฌ๋ฌ๋ถ์ด ํํ๋กญ๊ฒ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์๋ ์ฌ์ด, ์ด๋ฏธ ๊ฐ๋น ๋ฐ์๋ ๊ทน๋จ ์๋ฆฌ์ฃผ์ ๋ฏผ์ดํ ํ ๋ฌ๋ฆฌ์คํธ ๊น์ค์์ด ํ๊ต๋ฅผ ์ ๋ นํ๋ค.
์ ๋ ฅ๋ฐ์ ์์ด์ 3์ด ์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ค์ง ์์ผ๋ฉด ๊ฐ๋น์ ์ค์นํด๋์ ๋ฏผ์ด ํญํ์ด ํฐ์ง๋ค.
๋น์ ์ ์์ด์ ์ด๋ค ์์ Ai๋ฅผ ๋ค๋ฅธ ์ X๋ก ๋ฐ๊ฟ ์ ์๋ค.
์ด ์ฐ์ฐ์๋ 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
3...
2...
1...
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋น์ ์ด ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ค์ด์ผ ํ๋ ์์ด์ ๊ธธ์ด N์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์ ์์ด์ ์์๋ค์ ๋ํ๋ด๋ N๊ฐ์ ์ ์ A1,A2,โฏ,AN์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
3๋ฒ์ ์ฐ์ฐ ์์ ์์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ค ์ ์์ผ๋ฉด,
- ์ฒซ์งธ ์ค์ YES๋ฅผ ์ถ๋ ฅํ๋ค.
- ๋์งธ ์ค๋ถํฐ, ์์ด์ ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ถ๋ ฅํ๋ค.
- ์ฒซ์งธ ์ค์, ์ฐ์ฐ ํ์ K๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ดํ, K๊ฐ์ ์ค์ ๊ฑธ์ณ, ์ ์ฉํ ์ฐ์ฐ์ ์์๋๋ก ์ถ๋ ฅํ๋ค.
๊ตฌ์ฒด์ ์ผ๋ก, ๊ฐ ์ค์ ๋ ์ ์ i์ X๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋, ์์ Ai๋ฅผ X๋ก ๋ฐ๊พธ๋ ์ฐ์ฐ์ ์๋ฏธํ๋ค. (1≤i≤N, 1≤X≤1000000000)
์ฐ์ฐ์ ํ์๋ฅผ ์ต์ํํ ํ์๊ฐ ์์ผ๋ฉฐ, ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด ์ฌ๋ฟ ์์ผ๋ฉด ์๋ฌด ๋ฐฉ๋ฒ์ด๋ ํ๋ ์ถ๋ ฅํด๋ ๊ด์ฐฎ๋ค. ๊ฐ์ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ ํด๋ ๋๋ค.
3๋ฒ์ ์ฐ์ฐ ์์ ์์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ค ์ ์์ผ๋ฉด,
- ์ฒซ์งธ ์ค์ NO๋ฅผ ์ถ๋ ฅํ๋ค.
โธ ์ ํ
- 1≤N≤200000
- โ1≤Ai≤1000000000 (1≤i≤N)
- ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์์ด์ ์ฃผ์ด์ง์ง ์๋๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 1
- ๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด: o(n log n)
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
๋จผ์ , ์กฐ๊ฑด์ ๋ง๊ฒ ์์ด์ ๊ธธ์ด N๊ณผ ์์ด A๋ฅผ ์ ๋ ฅ๋ฐ์๋ค.
์ด๋, ์์ด์ ๋ง์ง๋ง ๊ฐ์ด ํญ์ ์ต๋๊ฐ์ด๋ผ๋ ๋ณด์ฅ์ด ์์ผ๋ฏ๋ก, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ n+1๋ก ์ค์ ํ๊ณ ๋ ๊ฐ์ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ ํ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ด๋ถ ํ์์ ํ์ฉํ์ฌ LIS์ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๋ค.
์์ด์ ๊ธธ์ด N์์ LIS์ ๊ธธ์ด๋ฅผ ๋นผ๋ฉด, ์์ด A๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ์ต์ ์ฐ์ฐ ํ์๋ฅผ ๊ตฌํ ์ ์๋ค.
์ฐ์ฐ ํ์๊ฐ 3๋ณด๋ค ํฌ๋ค๋ฉด, 3๋ฒ์ ์ฐ์ฐ ์์ ์์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก "NO"๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฐ๋๋ก, 3๋ฒ์ ์ฐ์ฐ ์์ ์์ด์ ์ ๋ ฌํ ์ ์๋ค๋ฉด, "YES"๋ฅผ ์ถ๋ ฅํ ํ ์ฐ์ฐ ํ์ K์ ๋ณ๊ฒฝํ ์ธ๋ฑ์ค ๋ฐ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๋ณ๊ฒฝํ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด, length ๋ฐฐ์ด์ ํ์ฉํ์ฌ LIS์ ํฌํจ๋ ์์๋ค์ ์ญ์ถ์ ํ๋ค.
length[i]๋ A[i]๊ฐ LIS์์ ๋ช ๋ฒ์งธ ์์์ธ์ง ๋ํ๋ด๋ฏ๋ก, ์ด๋ฅผ ์ญ์์ผ๋ก ํ์ํ๋ฉฐ LIS ์์๋ค์ ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ๊ตฌํ LIS ์์์ ์๋ ๋ฐฐ์ด์ ๋น๊ตํ์ฌ, LIS์ ์ํ์ง ์์ ์์๋ค์ ์ฐพ์ ์ ์ ํ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
๋ฐฐ์ด์ ์ญ์์ผ๋ก ํ์ํ๋ฉฐ,
ํ์ฌ ์์ A[i]๊ฐ LIS์ ํด๋น ์์น ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด ๊ทธ๋๋ก ๋๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด, ๋ฐ๋ก ๋ค์ ์์(A[i+1])๋ก ๋ณ๊ฒฝํ์ฌ ์ค๋ฆ์ฐจ์์ ์ ์งํ๋ค.
๋ณ๊ฒฝ๋ ์ฐ์ฐ์ ๊ธฐ๋กํ์ฌ ์ถ๋ ฅํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 41904KB
์๊ฐ : 304ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int n;
static int[] A, length;
static final int MAX = 1000000000;
static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine()); // ์์ด์ ๊ธธ์ด
A = new int[n+1]; // ์์ด
length = new int[n]; // ๊ฐ ์์๊ฐ LIS์ ๋ช ๋ฒ์งธ ์์น์ธ์ง ์ ์ฅ
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
A[n] = MAX;
// ์ฐ์ฐ ํ์ ๊ตฌํ๊ธฐ
int lisCnt = getLis();
int k = n - lisCnt; // ์ฐ์ฐ ํ์
// 3๋ฒ์ ์ฐ์ฐ์ผ๋ก ์ค๋ฆ์ฐจ์์ ๋ง๋ค ์ ์์
if (k > 3) {
System.out.println("NO");
return;
}
// 3๋ฒ์ ์ฐ์ฐ์ผ๋ก ์ค๋ฆ์ฐจ์์ ๋ง๋ค ์ ์์
StringBuilder sb = new StringBuilder();
sb.append("YES").append("\n").append(k).append("\n");
int cnt = lisCnt;
int[] lis = new int[n];
for (int i = n-1; i >= 0; i--) {
if (length[i] == cnt) {
lis[cnt--] = A[i];
}
}
cnt = lisCnt;
for (int i = n-1; i >= 0; i--) {
if (A[i] == lis[cnt]) {
cnt--;
continue;
}
int x = A[i+1];
sb.append(i+1).append(" ").append(x).append("\n");
A[i] = x;
}
System.out.println(sb.toString());
}
private static int getLis() {
int[] lis = new int[n+1];
int len = 0, idx;
Arrays.fill(lis, INF);
lis[0] = 0;
for (int i = 0; i < n; i++) {
idx = binarySearch(0, len+1, A[i], lis);
lis[idx] = A[i];
length[i] = idx;
len = Math.max(len, idx);
}
return len;
}
private static int binarySearch(int start, int end, int target, int[] lis) {
int mid;
while (start < end) {
mid = start + (end-start) / 2;
if (lis[mid] <= target) start = mid+1;
else end = mid;
}
return end;
}
}
์ด๋ ต๋ค.. ๋๋ฌด ์ด๋ ต๋ค.. ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ์ฐธ๊ณ ํด์ ํ์๋๋ฐ๋ ์ดํด๊ฐ ์ ๊ฐ์ ํ๊ฒน๊ฒ ํด๊ฒฐํ๋ค...
๋ธ๋ก๊ทธ์ ํฌ์คํ
ํ๋ ค๊ณ ๋ค์ ๋ฌธ์ ๋ฅผ ํ๊ณ ํ์ด ๊ณผ์ ์ ์ ์ผ๋ฉด์ ๋ง์ด ์ ๋ฆฌ๋์ง๋ง
์ผ์ฃผ์ผ ๋ค์ ๊ผญ ๋ค์ ํ์ด๋ด์ผ์ง... ๐๐ญ
๐ reference