結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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());
  }
}
0