제출 #367591

#제출 시각아이디문제언어결과실행 시간메모리
367591dapigRegions (IOI09_regions)Java
0 / 100
5083 ms71212 KiB
//package eulertour; import java.io.*; import java.util.*; class regions { public static void main(String[] args) throws IOException { regions obj = new regions(); obj.doStuff(); } int[] vis; void tour() { ArrayDeque<Integer> q = new ArrayDeque<>(); q.add(0); vis = new int[regvals.length]; int count = 1; while (!q.isEmpty()) { int next = q.poll(); if (vis[next] == 0) { vis[next] = count; newregvals[regvals[next]].add(count); q.push(next); for (int i : graph[next]) { q.push(i); } count++; } else { Stack<int[]> target = regions[regvals[next]]; int[] toAdd = new int[] {vis[next]-1, count-1}; while (!target.isEmpty()) { int[] top = target.peek(); if (top[1] <= toAdd[1] && top[0] >= toAdd[0]) target.pop(); else break; } target.add(toAdd); } } } int bs(int r2, int val) { ArrayList<Integer> reg = newregvals[r2]; int l = 0, r = reg.size()-1; while (l < r) { int m = (l+r)/2; if (reg.get(m) <= val) { if (reg.get(m+1) > val) return m; l = m+1; } else r = m; } return l; } int employ, regcount, quers; int[] regvals; // region values ArrayList<Integer>[] graph; Stack<int[]>[] regions; ArrayList<Integer>[] newregvals; @SuppressWarnings("unchecked") private void doStuff() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); employ = Integer.parseInt(st.nextToken()); regcount = Integer.parseInt(st.nextToken()); quers = Integer.parseInt(st.nextToken()); regvals = new int[employ]; graph = new ArrayList[employ]; regions = new Stack[regcount]; newregvals = new ArrayList[regcount]; for (int i = 0; i < graph.length; i++) { graph[i] = new ArrayList<>(); } for (int i = 0; i < regions.length; i++) { regions[i] = new Stack<>(); newregvals[i] = new ArrayList<>(); } regvals[0] = Integer.parseInt(br.readLine())-1; for (int i = 1; i < regvals.length; i++) { st = new StringTokenizer(br.readLine()); graph[Integer.parseInt(st.nextToken())-1].add(i); regvals[i] = Integer.parseInt(st.nextToken())-1; } tour(); for (int i = 0; i < newregvals.length; i++) { newregvals[i].add(Integer.MIN_VALUE); Collections.sort(newregvals[i]); } for (int i = 0; i < quers; i++) { st = new StringTokenizer(br.readLine()); int r1 = Integer.parseInt(st.nextToken())-1; int r2 = Integer.parseInt(st.nextToken())-1; int ans = 0; for (int[] j : regions[r1]) { ans += (bs(r2, j[1]) - bs(r2, j[0])); } System.out.println(ans); System.out.flush(); } br.close(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...