結果
問題 | No.2325 Skill Tree |
ユーザー | ゆうき |
提出日時 | 2023-05-28 14:49:15 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 1,406 ms / 3,000 ms |
コード長 | 8,578 bytes |
コンパイル時間 | 3,743 ms |
コンパイル使用メモリ | 101,804 KB |
実行使用メモリ | 123,892 KB |
最終ジャッジ日時 | 2024-06-08 06:15:01 |
合計ジャッジ時間 | 41,244 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 61 ms
37,368 KB |
testcase_01 | AC | 63 ms
38,192 KB |
testcase_02 | AC | 61 ms
37,860 KB |
testcase_03 | AC | 61 ms
37,848 KB |
testcase_04 | AC | 59 ms
37,588 KB |
testcase_05 | AC | 64 ms
37,704 KB |
testcase_06 | AC | 64 ms
37,868 KB |
testcase_07 | AC | 487 ms
57,768 KB |
testcase_08 | AC | 529 ms
70,244 KB |
testcase_09 | AC | 603 ms
67,692 KB |
testcase_10 | AC | 593 ms
79,172 KB |
testcase_11 | AC | 636 ms
77,920 KB |
testcase_12 | AC | 1,005 ms
109,044 KB |
testcase_13 | AC | 988 ms
106,752 KB |
testcase_14 | AC | 1,026 ms
107,852 KB |
testcase_15 | AC | 1,028 ms
106,580 KB |
testcase_16 | AC | 887 ms
104,096 KB |
testcase_17 | AC | 1,033 ms
103,584 KB |
testcase_18 | AC | 1,031 ms
103,848 KB |
testcase_19 | AC | 1,036 ms
103,500 KB |
testcase_20 | AC | 1,153 ms
105,232 KB |
testcase_21 | AC | 1,052 ms
104,688 KB |
testcase_22 | AC | 672 ms
109,172 KB |
testcase_23 | AC | 698 ms
114,464 KB |
testcase_24 | AC | 662 ms
108,488 KB |
testcase_25 | AC | 585 ms
102,156 KB |
testcase_26 | AC | 739 ms
116,328 KB |
testcase_27 | AC | 1,399 ms
123,748 KB |
testcase_28 | AC | 1,403 ms
123,892 KB |
testcase_29 | AC | 1,394 ms
123,428 KB |
testcase_30 | AC | 1,406 ms
123,392 KB |
testcase_31 | AC | 1,230 ms
114,036 KB |
testcase_32 | AC | 1,360 ms
116,564 KB |
testcase_33 | AC | 1,375 ms
116,468 KB |
testcase_34 | AC | 1,324 ms
116,792 KB |
testcase_35 | AC | 1,229 ms
123,468 KB |
testcase_36 | AC | 1,223 ms
123,528 KB |
testcase_37 | AC | 999 ms
111,092 KB |
ソースコード
import java.io.*; import java.lang.reflect.Array; import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.function.*; import static java.lang.Math.*; import static java.util.Arrays.*; //import static java.util.Collections.*; //import static java.util.Comparator.*; import java.awt.Point; class Solver{ static int infI = (int) 1e9; static long infL = (long) 1e18; // static long mod = (int) 1e9 +7; static long mod = 998244353; static String yes = "Yes"; static String no = "No"; Util util = new Util(); Random rd = ThreadLocalRandom.current(); MyReader in = new MyReader(System.in); MyWriter out = new MyWriter(System.out); MyWriter log = new MyWriter(System.err){ @Override protected void ln(){ super.ln(); flush(); }; }; int N = in.it(); int[][] T = new int[N][]; int[] needLvl = new int[N]; List<Set<Integer>> list = new ArrayList<>(); Object solve(){ for(int i = 1; i<N;i++) T[i] = new int[]{in.it(),in.idx()}; int Q = in.it(); int[][] qry = in.it(Q,2); for(int i = 0; i<N;i++) list.add(new HashSet<>()); for(int i = 1; i<N;i++) list.get(T[i][1]).add(i); fill(needLvl,-1); needLvl[0]=0; Set<Integer> seen = new HashSet<>(); dfs(0, seen); int[] sot = copyOf(needLvl,N); sort(sot); int ng =-1; while(ng+1<N && sot[ng+1]<0) ng++; for(var q : qry){ if(q[0] == 1){ int x = q[1]; out.println(bSearchI(0,N,i-> sot[i]<=x)-ng); }else{ log.println(q); int y = q[1]; out.println(needLvl[y-1]); } } return null; } void dfs(int p,Set<Integer> pars){ pars.add(p); for(var i : list.get(p)){ if(pars.contains(i)){ needLvl[i]=-1; } needLvl[i] = Math.max(T[i][0],needLvl[p]); dfs(i,pars); } pars.remove(p); } int bSearchI(int o,int n,Predicate<Integer> judge){ for (int c = 0;1 < Math.abs(n -o);) if (judge.test(c = o +n >>1)) o = c; else n = c; return o; } long bSearchL(long o,long n,Predicate<Long> judge){ for (long c = 0;1 < Math.abs(n -o);) if (judge.test(c = o +n >>1)) o = c; else n = c; return o; } long pow(long x , long n){ x%=mod; if(n==0) return 1; if(n==1) return x; return pow(x*x,n/2)*pow(x,n%2)%mod; } } class Edge{ int id; int u; int v; long l; Edge rev; Edge(int id,int u,int v){ this.id = id; this.u = u; this.v = v; } void rev(Edge rev){ rev.l = l; } } class Util{ long st = System.currentTimeMillis(); long elapsed(){ return System.currentTimeMillis() -st; } static int[][] trans(int[]... T){ return arr(new int[T[0].length][],i -> arrI(T.length,j -> T[j][i])); } static int[][] addId(int[][] T){ return arr(new int[T.length][],i -> { int[] t = copyOf(T[i],T[i].length +1); t[t.length -1] = i; return t; }); } static long[][] trans(long[]... T){ return arr(new long[T[0].length][],i -> arrL(T.length,j -> T[j][i])); } static double[][] trans(double[]... T){ return arr(new double[T[0].length][],i -> arrD(T.length,j -> T[j][i])); } static int[] arrI(int N,IntUnaryOperator f){ int[] ret = new int[N]; setAll(ret,f); return ret; } static long[] arrL(int N,IntToLongFunction f){ long[] ret = new long[N]; setAll(ret,f); return ret; } static double[] arrD(int N,IntToDoubleFunction f){ double[] ret = new double[N]; setAll(ret,f); return ret; } static <T> T[] arr(T[] arr,IntFunction<T> f){ setAll(arr,f); return arr; } } class MyReader{ byte[] buf = new byte[1 <<16]; int ptr = 0; int tail = 0; InputStream in; MyReader(InputStream in){ this.in = in; } byte read(){ if (ptr == tail) try { tail = in.read(buf); ptr = 0; } catch (IOException e) {} return buf[ptr++]; } boolean isPrintable(byte c){ return 32 < c && c < 127; } boolean isNum(byte c){ return 47 < c && c < 58; } byte nextPrintable(){ byte ret = read(); while (!isPrintable(ret)) ret = read(); return ret; } int it(){ return Math.toIntExact(lg()); } int[] it(int N){ return Util.arrI(N,i -> it()); } int[][] it(int H,int W){ return Util.arr(new int[H][],i -> it(W)); } int idx(){ return it() -1; } int[] idx(int N){ return Util.arrI(N,i -> idx()); } int[][] idx(int H,int W){ return Util.arr(new int[H][],i -> idx(W)); } int[][] qry(int Q){ return Util.arr(new int[Q][],i -> new int[]{idx(), idx(), i}); } long lg(){ byte i = nextPrintable(); boolean negative = i == 45; long n = negative ? 0 : i -'0'; while (isPrintable(i = read())) n = 10 *n +i -'0'; return negative ? -n : n; } long[] lg(int N){ return Util.arrL(N,i -> lg()); } long[][] lg(int H,int W){ return Util.arr(new long[H][],i -> lg(W)); } double dbl(){ return Double.parseDouble(str()); } double[] dbl(int N){ return Util.arrD(N,i -> dbl()); } double[][] dbl(int H,int W){ return Util.arr(new double[H][],i -> dbl(W)); } char[] ch(){ return str().toCharArray(); } char[][] ch(int H){ return Util.arr(new char[H][],i -> ch()); } String line(){ StringBuilder sb = new StringBuilder(); for (byte c;(c = read()) != '\n';) sb.append((char) c); return sb.toString(); } String str(){ StringBuilder sb = new StringBuilder(); sb.append((char) nextPrintable()); for (byte c;isPrintable(c = read());) sb.append((char) c); return sb.toString(); } String[] str(int N){ return Util.arr(new String[N],i -> str()); } Edge[] e(int N,int M){ return e(N,M,e -> e.l = 1); } Edge[] e(int N,int M,Consumer<Edge> f){ return Util.arr(new Edge[M],i -> { Edge e = new Edge(i,idx(),idx()); f.accept(e); return e; }); } Edge[][] g(int N,int M,boolean b){ return g(N,b,e(N,M)); } Edge[][] g(int N,int M,boolean b,Consumer<Edge> f){ return g(N,b,e(N,M,f)); } Edge[][] g(int N,boolean b,Edge[] E){ int[] c = new int[N]; for (Edge e:E) { c[e.u]++; if (!b) c[e.v]++; } Edge[][] g = Util.arr(new Edge[N][],i -> new Edge[c[i]]); for (Edge e:E) { g[e.u][--c[e.u]] = e; if (!b) { Edge rev = new Edge(e.id,e.v,e.u); e.rev(rev); g[e.v][--c[e.v]] = e.rev = rev; } } return g; } } class MyWriter{ OutputStream out; byte[] buf = new byte[1 <<16]; byte[] ibuf = new byte[20]; int tail = 0; MyWriter(OutputStream out){ this.out = out; } void flush(){ try { out.write(buf,0,tail); tail = 0; } catch (IOException e) { e.printStackTrace(); } } private void sp(){ write((byte) ' '); } protected void ln(){ write((byte) '\n'); } private void write(byte b){ buf[tail++] = b; if (tail == buf.length) flush(); } private void write(byte[] b,int off,int len){ for (int i = off;i < off +len;i++) write(b[i]); } private void write(long n){ if (n < 0) { n = -n; write((byte) '-'); } int i = ibuf.length; do { ibuf[--i] = (byte) (n %10 +'0'); n /= 10; } while (n > 0); write(ibuf,i,ibuf.length -i); } private void print(Object obj){ if (obj instanceof Boolean) print((boolean) obj ? Solver.yes : Solver.no); else if (obj instanceof Character) write((byte) (char) obj); else if (obj instanceof Integer) write((int) obj); else if (obj instanceof Long) write((long) obj); else if (obj instanceof char[]) for (char b:(char[]) obj) write((byte) b); else if (obj instanceof Collection<?>) { Iterator<?> itr = ((Collection<?>) obj).iterator(); while (itr.hasNext()) { print(itr.next()); if (itr.hasNext()) ln(); } } else if (obj.getClass().isArray()) { int l = Array.getLength(obj); boolean ln = false; if (0 < l) { Object a = Array.get(obj,0); ln = !(a instanceof char[]) && a.getClass().isArray(); } for (int i = 0;i < l;i++) { print(Array.get(obj,i)); if (i +1 < l) if (ln) ln(); else sp(); } } else for (char b:Objects.toString(obj).toCharArray()) write((byte) b); } void println(Object obj){ if (obj == null) return; print(obj); ln(); } } class Main{ public static void main(String[] args) throws Exception{ Solver solver = new Solver(); Optional.ofNullable(solver.solve()).ifPresent(solver.out::println); solver.out.flush(); solver.log.println(solver.util.elapsed()); } }