Submission #733510

#TimeUsernameProblemLanguageResultExecution timeMemory
733510rahulverma Martian DNA (BOI18_dna)Java
100 / 100
1668 ms38176 KiB
import java.io.*;
import java.util.*;

 class dna {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// two pointers
		
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		int k = s.nextInt();
		int r = s.nextInt();
		int[] freq = new int[k+5];
		int[] req = new int[k+5];
		int[] arr = new int[n];
		for(int i = 0; i < n; i++) {
			arr[i] = s.nextInt();
			freq[arr[i]]++;
		}
		for(int i = 0; i < r; i++) {
			int v1 = s.nextInt();
			int v2 = s.nextInt();
			req[v1] += v2;
		}
		for(int i = 0; i < k + 5; i++) {
			if(freq[i] < req[i]) {
				System.out.println("impossible");
				return;
			}
		}
		
		int left = 0;
		int right = n;
		
		while(left < right) {
			int mid = left + (right - left)/2;
			boolean works = false;
			int[] curFreq = new int[k+5];
			for(int i = 0; i < mid; i++) {
				curFreq[arr[i]]++;
			}
			HashSet<Integer> invalid = new HashSet<>();
			for(int i = 0; i < k+5; i++) {
				if(curFreq[i] < req[i]) {
					invalid.add(i);
				}
			}
			if(invalid.size() == 0) works = true;
			else {
				for(int i = mid; i < n; i++) {
					curFreq[arr[i]]++;
					if(invalid.contains(arr[i]) && curFreq[arr[i]] >= req[arr[i]]) {
						invalid.remove(arr[i]);
					}
					curFreq[arr[i-mid]]--;
					if(curFreq[arr[i-mid]] < req[arr[i-mid]]) {
						invalid.add(arr[i-mid]);
					}
					if(invalid.size() == 0) {
						works = true;
						break;
					}
				}
			}
			if(works) {
				right = mid;
			}
			else {
				left = mid + 1;
			}
		}
		System.out.println(left);
		
		
	}

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...