提出 #70487406


ソースコード 拡げる

import std.conv, std.functional, std.range, std.stdio, std.string;
import std.algorithm, std.array, std.bigint, std.bitmanip, std.complex, std.container, std.math, std.mathspecial, std.numeric, std.regex, std.typecons;
import core.bitop;

class EOFException : Throwable { this() { super("EOF"); } }
string[] tokens;
string readToken() { for (; tokens.empty; ) { if (stdin.eof) { throw new EOFException; } tokens = readln.split; } auto token = tokens.front; tokens.popFront; return token; }
int readInt() { return readToken.to!int; }
long readLong() { return readToken.to!long; }

string COLOR(string s = "") { return "\x1b[" ~ s ~ "m"; }

bool chmin(T)(ref T t, in T f) { if (t > f) { t = f; return true; } else { return false; } }
bool chmax(T)(ref T t, in T f) { if (t < f) { t = f; return true; } else { return false; } }

int binarySearch(alias pred, T)(in T[] as) { int lo = -1, hi = cast(int)(as.length); for (; lo + 1 < hi; ) { const mid = (lo + hi) >> 1; (unaryFun!pred(as[mid]) ? hi : lo) = mid; } return hi; }
int lowerBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a >= val)); }
int upperBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a > val)); }


enum INF = 1001001001;

void main() {
  try {
    for (; ; ) {
      const numCases = readInt;
      foreach (caseId; 0 .. numCases) {
        const N = readInt;
        const M = readInt;
        auto A = new int[M];
        auto B = new int[M];
        foreach (i; 0 .. M) {
          A[i] = readInt - 1;
          B[i] = readInt - 1;
        }
        auto P = new int[N];
        foreach (j; 0 .. N) P[j] = readInt - 1;
        
        auto invP = new int[N];
        invP[] = -1;
        foreach (j; 0 .. N) invP[P[j]] = j;
        foreach (i; 0 .. M) {
          A[i] = P[A[i]];
          B[i] = P[B[i]];
        }
        debug writefln("A = %s, B = %s", A, B);
        P = invP = null;
        
        auto graph = new int[][N];
        foreach (i; 0 .. M) {
          graph[A[i]] ~= B[i];
        }
        
        /*
          gs: l -> known
          hs: known -> r
        */
        auto fs = new int[N];
        auto gs = new int[N];
        auto hs = new int[N];
        fs[] = 1;
        gs[] = -INF;
        hs[] = -INF;
        foreach (u; 0 .. N) {
          chmax(fs[u], gs[u]);
          chmax(hs[u], fs[u]);
          if (u + 1 < N) {
            chmax(gs[u + 1], gs[u]);
            chmax(hs[u + 1], hs[u]);
          }
          foreach (v; graph[u]) {
            chmax(fs[v], fs[u] + 1);
            chmax(gs[v], fs[u]);
            chmax(fs[v], hs[u] + 1);
          }
        }
        debug {
          writeln(fs);
          writeln(gs);
          writeln(hs);
        }
        
        const ans = N - fs.maxElement;
        writeln(ans);
        
        debug {{
          int[][] pss;
          {
            auto ps = iota(N).array;
            do {
              bool topo = true;
              foreach (i; 0 .. M) {
                topo = topo && (ps[A[i]] < ps[B[i]]);
              }
              if (topo) {
                pss ~= ps.dup;
              }
            } while (ps.nextPermutation);
          }
          int brt = int.max;
          int hm;
          foreach (h; 0 .. 1 << N) {
            int cnt;
            foreach (ps; pss) {
              bool ok = true;
              foreach (u; 0 .. N) if (h >> u & 1) {
                ok = ok && (ps[u] == u);
              }
              if (ok) ++cnt;
            }
            assert(cnt >= 1);
            if (cnt == 1) {
              if (chmin(brt, popcnt(h))) hm = h;
            }
          }
          write("brt = ", brt, "; ");
          foreach (u; 0 .. N) write(hm >> u & 1);
          writeln;
          if (brt != ans) {
            stderr.writeln("FAIL");
            stderr.writeln(N, " ", M);
            foreach (i; 0 .. M) {
              stderr.writeln(A[i] + 1, " ", B[i] + 1);
            }
            foreach (u; 0 .. N) stderr.write(u + 1, " ");
            stderr.writeln;
            assert(false);
          }
        }}
      }
    }
  } catch (EOFException e) {
  }
}
/*
1 0
1

6 5
3 4
4 5
1 2
1 5
3 6
1 2 3 4 5 6
*/

提出情報

提出日時
問題 A - Communicate Topological Order
ユーザ hos_lyric
言語 D (LDC 1.32.2)
得点 700
コード長 4284 Byte
結果 AC
実行時間 78 ms
メモリ 27108 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 1
AC × 70
セット名 テストケース
Sample sample.txt
All dense_1.txt, dense_10.txt, dense_2.txt, dense_3.txt, dense_4.txt, dense_5.txt, dense_6.txt, dense_7.txt, dense_8.txt, dense_9.txt, line_1.txt, line_10.txt, line_2.txt, line_3.txt, line_4.txt, line_5.txt, line_6.txt, line_7.txt, line_8.txt, line_9.txt, random_1.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_2.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, random_3.txt, random_30.txt, random_31.txt, random_32.txt, random_33.txt, random_34.txt, random_35.txt, random_36.txt, random_37.txt, random_38.txt, random_39.txt, random_4.txt, random_40.txt, random_5.txt, random_6.txt, random_7.txt, random_8.txt, random_9.txt, sample.txt, small_1.txt, small_2.txt, small_3.txt, small_4.txt, small_5.txt, small_6.txt, small_7.txt, small_8.txt, small_9.txt
ケース名 結果 実行時間 メモリ
dense_1.txt AC 72 ms 20104 KiB
dense_10.txt AC 68 ms 15780 KiB
dense_2.txt AC 69 ms 18532 KiB
dense_3.txt AC 68 ms 15796 KiB
dense_4.txt AC 68 ms 10736 KiB
dense_5.txt AC 70 ms 18448 KiB
dense_6.txt AC 66 ms 9324 KiB
dense_7.txt AC 71 ms 18024 KiB
dense_8.txt AC 70 ms 17216 KiB
dense_9.txt AC 67 ms 14476 KiB
line_1.txt AC 71 ms 19972 KiB
line_10.txt AC 73 ms 21824 KiB
line_2.txt AC 73 ms 20144 KiB
line_3.txt AC 68 ms 25428 KiB
line_4.txt AC 60 ms 17960 KiB
line_5.txt AC 68 ms 15556 KiB
line_6.txt AC 70 ms 17280 KiB
line_7.txt AC 64 ms 18072 KiB
line_8.txt AC 73 ms 24392 KiB
line_9.txt AC 71 ms 19032 KiB
random_1.txt AC 77 ms 18720 KiB
random_10.txt AC 35 ms 17608 KiB
random_11.txt AC 71 ms 11292 KiB
random_12.txt AC 78 ms 18680 KiB
random_13.txt AC 77 ms 27108 KiB
random_14.txt AC 67 ms 26120 KiB
random_15.txt AC 78 ms 18836 KiB
random_16.txt AC 68 ms 11208 KiB
random_17.txt AC 73 ms 19144 KiB
random_18.txt AC 58 ms 18364 KiB
random_19.txt AC 59 ms 14988 KiB
random_2.txt AC 78 ms 18148 KiB
random_20.txt AC 77 ms 18780 KiB
random_21.txt AC 75 ms 18700 KiB
random_22.txt AC 77 ms 18644 KiB
random_23.txt AC 76 ms 19088 KiB
random_24.txt AC 67 ms 18368 KiB
random_25.txt AC 78 ms 23520 KiB
random_26.txt AC 43 ms 14828 KiB
random_27.txt AC 70 ms 17248 KiB
random_28.txt AC 77 ms 18952 KiB
random_29.txt AC 77 ms 18660 KiB
random_3.txt AC 39 ms 15808 KiB
random_30.txt AC 66 ms 14564 KiB
random_31.txt AC 74 ms 26888 KiB
random_32.txt AC 76 ms 19800 KiB
random_33.txt AC 60 ms 21744 KiB
random_34.txt AC 76 ms 18780 KiB
random_35.txt AC 73 ms 15784 KiB
random_36.txt AC 74 ms 14840 KiB
random_37.txt AC 78 ms 18724 KiB
random_38.txt AC 41 ms 17644 KiB
random_39.txt AC 72 ms 20516 KiB
random_4.txt AC 69 ms 19712 KiB
random_40.txt AC 32 ms 17576 KiB
random_5.txt AC 71 ms 14548 KiB
random_6.txt AC 78 ms 18664 KiB
random_7.txt AC 77 ms 18728 KiB
random_8.txt AC 71 ms 18308 KiB
random_9.txt AC 71 ms 13960 KiB
sample.txt AC 1 ms 3164 KiB
small_1.txt AC 55 ms 3832 KiB
small_2.txt AC 55 ms 3924 KiB
small_3.txt AC 54 ms 3772 KiB
small_4.txt AC 54 ms 3844 KiB
small_5.txt AC 54 ms 3776 KiB
small_6.txt AC 54 ms 3860 KiB
small_7.txt AC 54 ms 3904 KiB
small_8.txt AC 54 ms 3864 KiB
small_9.txt AC 22 ms 3920 KiB