private int solveIt(int casenr) { int n = io.getInt(); if (n == 0) { return 0; } double[] perc = new double[n]; double mod = .5; for (int i = 0; i < n; i++) { String word = io.getWord(); if (i == 0 && word.contains(".")) { String wrd = word.split("\\.")[1]; for (int j = 0; j < wrd.length(); j++) { mod /= 10; } } perc[i] = Double.parseDouble(word) / 100.d; } double s = 0; mod /= 100; for (int i = 0; i < perc.length; i++) { s += perc[i]; } if (perc.length <= 2 && Math.abs(s - 0.99) < 1e-10) { return -1; } out: for (int pp = 1; pp < 10000; pp++) { int minleft = pp; int maxleft = pp; for (int i = 0; i < perc.length; i++) { double use = perc[i] * pp; double min = Math.floor(use); if (min / pp > perc[i] - mod && min > 0) { } else if ((min + 1) / pp < perc[i] + mod) { min++; } else { continue out; } double max = min; while ((min - 1) / pp >= perc[i] - mod) { min--; } while ((max + 1) / pp <= perc[i] + mod) { max++; } minleft -= max; maxleft -= min; } if (minleft <= maxleft && minleft <= 0 && maxleft >= 0) { return pp; } } return -1; }
private void solve() throws Throwable { io = new ZKattio(stream); long t0 = -System.currentTimeMillis(); int n = io.getInt(); int[] midcnt = new int[n]; int[] botcnt = new int[n]; int[] topPos = new int[n]; List[] midPos = new ArrayList[n]; List[] botPos = new ArrayList[n]; int[][] nodes = new int[n][3]; for (int i = 0; i < n; i++) { midPos[i] = new ArrayList(); botPos[i] = new ArrayList(); } for (int i = 0; i < n; i++) { int v = io.getInt() - 1; topPos[v] = i; // .add(i); nodes[i][0] = v; } for (int i = 0; i < n; i++) { int num = io.getInt() - 1; midPos[num].add(i); midcnt[num]++; nodes[i][1] = num; } for (int i = 0; i < n; i++) { int num = io.getInt() - 1; botPos[num].add(i); botcnt[num]++; nodes[i][2] = num; } Stack<Integer> todo = new Stack(); boolean[] in = new boolean[n]; Arrays.fill(in, true); for (int i = 0; i < n; i++) { if (botcnt[i] < 1 || midcnt[i] < 1) { todo.add(i); in[i] = false; } } boolean[] columnDone = new boolean[n]; while (todo.size() > 0) { Integer pop = todo.pop(); List<Integer> colrm = new ArrayList(); colrm.add(topPos[pop]); for (int i = 0; i < midPos[pop].size(); i++) { Integer c = (Integer) midPos[pop].get(i); colrm.add(c); } for (int i = 0; i < botPos[pop].size(); i++) { Integer c = (Integer) botPos[pop].get(i); colrm.add(c); } for (int i = 0; i < colrm.size(); i++) { Integer rm = colrm.get(i); if (columnDone[rm]) { continue; } columnDone[rm] = true; int[] js = nodes[rm]; midcnt[js[1]]--; if (midcnt[js[1]] < 1 && in[js[1]]) { todo.add(js[1]); in[js[1]] = false; } botcnt[js[2]]--; if (botcnt[js[2]] < 1 && in[js[2]]) { todo.add(js[2]); in[js[2]] = false; } if (in[js[0]]) { in[js[0]] = false; todo.add(js[0]); } } } int ans = 0; for (int i = 0; i < in.length; i++) { if (!in[i]) { ans++; } } if (test) { System.out.println(System.currentTimeMillis() + t0); } System.out.println(ans); }