본문 바로가기

코드포스

[Hello 2023] D. Boris and His Amazing Haircut

 

 


※. a[i] < b[i]가 있으면 no

 

※. b의 큰수부터 바꿔준다. 더 작다면 큰수로 바꿔도 이후에 다시 바꿀 수 있다.

(a : 3, 3, 3 b = 2,1,2 일 때 전체를 2로 변경 후 중간을 1로 변경해주면 된다.)

 

※. 배열을 탐색하며 변경해야 하는 수는 스택에 넣어준다. 이 때 스택에 변경해야 하는 수보다 작은 수가 있다면 pop

(전체를 5 3 1 5 로 바꿔야 한다면 5 5 5 5 -> 5 3 3 3 -> 5 3 1 1 -> 1,3 pop -> 5 3 1 5  [5,3,1])

 

※. a[i]와 b[i]가 같으면 b[i]보다 작은 수만 빼주면 된다.

 

※. 스택 대신 TreeSet도 가능

(treeset.headSet(b[i]).clear() -> b[i]보다 작은수를 반환 후 전부 제거한다.)

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(br.readLine());
		while(T --> 0) {
			int n = Integer.parseInt(br.readLine());
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int[] a = new int[n];
			int[] b = new int[n];
			boolean answer = false;
			for(int i = 0; i < n; i++) {
				a[i] = Integer.parseInt(st.nextToken());
			}
			st = new StringTokenizer(br.readLine(), " ");
			for(int i = 0; i < n; i++) {
				int x = Integer.parseInt(st.nextToken());
				if(a[i] < x) answer = true;
				
				b[i] = x;
			}
			int m = Integer.parseInt(br.readLine());
			HashMap<Integer, Integer> map = new HashMap<>();
			st = new StringTokenizer(br.readLine(), " ");
			for(int i = 0; i < m; i++) {
				int x = Integer.parseInt(st.nextToken());
				map.put(x, map.getOrDefault(x, 0)+1);
			}
			
			if(answer) sb.append("NO").append('\n');
			else {
				Stack<Integer> stk = new Stack<>();
				for(int i = 0; i < n; i++) {
					while(!stk.isEmpty() && stk.peek() < b[i]) stk.pop();
					if(a[i] != b[i] && (stk.isEmpty() || stk.peek() != b[i])) {
						stk.push(b[i]);
						if(!map.containsKey(b[i]) || map.get(b[i]) <= 0) {
							answer = true;
							break;
						}
						map.put(b[i], map.get(b[i])-1);
					}
				}
				if(answer) sb.append("NO").append('\n');
				else
					sb.append("YES").append('\n');
			}
		}
		System.out.println(sb);
	}
}