Submission #70487135


Source Code Expand

// 30 bits, too tight...

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


int lis(const(int[]) as) {
  int[] dp;
  foreach (a; as) {
    const pos = dp.lowerBound(a);
    if (pos < dp.length) {
      dp[pos] = a;
    } else {
      dp ~= a;
    }
  }
  return cast(int)(dp.length);
}

alias Ans = Tuple!(int[], "ps", int[], "as");
Ans solveSmall(int N) {
  const E = bsr(N) + 1;
  auto fs = new int[E];
  foreach (i; 1 .. N + 1) ++fs[bsf(i)];
  
  auto cuts = new int[E + 1];
  foreach (e; 0 .. E) {
    cuts[e + 1] = cuts[e] + (bsr(fs[e]) + 1);
  }
  int[] ps;
  foreach (e; 0 .. E) {
    foreach (i; 0 .. fs[e]) {
      ps ~= (i + 1) << cuts[e];
    }
  }
  
  auto as = new int[N + 1];
  foreach (k; 1 .. N + 1) {
    auto used = new bool[E];
    int kk = k;
    foreach (e; 0 .. E) {
      if (kk >= fs[e]) {
        kk -= fs[e];
        used[e] = true;
      } else {
        if (e == 0) kk -= 1;
      }
    }
    assert(kk == 0);
    foreach (e; 0 .. E) if (!used[e]) {
      as[k] |= (1 << cuts[e + 1]) - (1 << cuts[e]);
    }
  }
  debug {
    writeln("N = ", N);
    writeln("fs = ", fs);
    writeln("ps = ", ps);
    writeln("as = ", as);
    foreach (p; ps) {
      foreach_reverse (e; 0 .. cuts[E]) write(p >> e & 1);
      writeln;
    }
    foreach (k; 1 .. N + 1) {
      auto qs = new int[N];
      foreach (j; 0 .. N) qs[j] = as[k] | ps[j];
      const res = lis(qs);
      assert(res == k, format("FAIL %s %s %s", k, res, qs));
    }
  }
  return Ans(ps, as);
}

Ans solve(int N) {
  int[] fs;
  for (int n = N; n; ) {
    const lim = (n + 1) / 2;
    const e = bsr(lim);
    fs ~= 1 << e;
    n -= (1 << e);
  }
  const E = cast(int)(fs.length);
  debug writefln("N = %s: fs = %s", N, fs);
  
  int[] ps;
  foreach (e; 0 .. E) {
    foreach (i; 0 .. fs[e]) ps ~= fs[0] << e | i;
  }
  ps.sort;
  assert(ps.length == N);
  assert(0 <= ps[0]); assert(ps[N - 1] < 2^^30);
  
  auto as = new int[N + 1];
  foreach (k; 1 .. N + 1) {
    // m ni tsubusu
    for (int m = fs[0]; ; m /= 2) {
      assert(m);
      auto used = new bool[E];
      int kk = k;
      foreach (e; 0 .. E) {
        const f = min(fs[e], m);
        if (kk >= f) {
          kk -= f;
          used[e] = true;
        }
      }
      if (used[0]) {
        foreach (e; 0 .. E) if (!used[e]) {
          as[k] |= fs[0] << e;
        }
        foreach (e; bsr(m) .. bsr(fs[0])) {
          as[k] |= 1 << e;
        }
        break;
      }
    }
  }
  debug {
    /*
    writeln("N = ", N);
    writeln("fs = ", fs);
    writeln("ps = ", ps);
    writeln("as = ", as);
    const limE = bsr(ps.maxElement) + 1;
    foreach (p; ps) {
      foreach_reverse (e; 0 .. limE) write(p >> e & 1);
      writeln;
    }
    //*/
    foreach (k; 1 .. N + 1) {
      auto qs = new int[N];
      foreach (j; 0 .. N) qs[j] = as[k] | ps[j];
      const res = lis(qs);
      assert(res == k, format("FAIL %s %s %s", k, res, qs));
    }
  }
  return Ans(ps, as);
}

void main() {
  debug {{
    // exper; return;
    // exper2; return;
    foreach (N; 1 .. 1000 + 1) {
      solve(N);
    }
  }}
  
  try {
    for (; ; ) {
      const numCases = readInt;
      foreach (caseId; 0 .. numCases) {
        const N = readInt;
        
        const ans = solve(N);
        foreach (i; 0 .. N) {
          if (i) write(" ");
          write(ans.ps[i]);
        }
        writeln;
        foreach (k; 1 .. N + 1) {
          if (k > 1) write(" ");
          write(ans.as[k]);
        }
        writeln;
      }
    }
  } catch (EOFException e) {
  }
}

Submission Info

Submission Time
Task C - PORALIS
User hos_lyric
Language D (LDC 1.32.2)
Score 900
Code Size 4839 Byte
Status AC
Exec Time 116 ms
Memory 3840 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 900 / 900
Status
AC × 1
AC × 89
Set Name Test Cases
Sample 00-sample-0.txt
All 00-sample-0.txt, 01-00.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, 01-50.txt, 01-51.txt, 01-52.txt, 01-53.txt, 01-54.txt, 01-55.txt, 01-56.txt, 01-57.txt, 01-58.txt, 01-59.txt, 01-60.txt, 01-61.txt, 01-62.txt, 01-63.txt, 01-64.txt, 01-65.txt, 01-66.txt, 01-67.txt, 01-68.txt, 01-69.txt, 01-70.txt, 01-71.txt, 01-72.txt, 01-73.txt, 01-74.txt, 01-75.txt, 01-76.txt, 01-77.txt, 01-78.txt, 01-79.txt, 01-80.txt, 01-81.txt, 01-82.txt, 01-83.txt, 02-0.txt, 03-0.txt, 03-1.txt, 03-2.txt
Case Name Status Exec Time Memory
00-sample-0.txt AC 1 ms 2888 KiB
01-00.txt AC 2 ms 3368 KiB
01-01.txt AC 2 ms 3156 KiB
01-02.txt AC 2 ms 3144 KiB
01-03.txt AC 2 ms 3280 KiB
01-04.txt AC 2 ms 2920 KiB
01-05.txt AC 2 ms 3044 KiB
01-06.txt AC 2 ms 3272 KiB
01-07.txt AC 2 ms 3280 KiB
01-08.txt AC 2 ms 3284 KiB
01-09.txt AC 2 ms 3136 KiB
01-10.txt AC 2 ms 3256 KiB
01-11.txt AC 1 ms 3224 KiB
01-12.txt AC 2 ms 3164 KiB
01-13.txt AC 2 ms 3112 KiB
01-14.txt AC 1 ms 3060 KiB
01-15.txt AC 2 ms 3176 KiB
01-16.txt AC 1 ms 3216 KiB
01-17.txt AC 2 ms 3132 KiB
01-18.txt AC 2 ms 3320 KiB
01-19.txt AC 2 ms 3136 KiB
01-20.txt AC 2 ms 3064 KiB
01-21.txt AC 2 ms 2916 KiB
01-22.txt AC 2 ms 3232 KiB
01-23.txt AC 2 ms 2944 KiB
01-24.txt AC 1 ms 3088 KiB
01-25.txt AC 2 ms 3096 KiB
01-26.txt AC 2 ms 3280 KiB
01-27.txt AC 2 ms 3132 KiB
01-28.txt AC 2 ms 3200 KiB
01-29.txt AC 2 ms 3232 KiB
01-30.txt AC 2 ms 3040 KiB
01-31.txt AC 2 ms 3324 KiB
01-32.txt AC 2 ms 3196 KiB
01-33.txt AC 2 ms 3104 KiB
01-34.txt AC 2 ms 3020 KiB
01-35.txt AC 1 ms 3216 KiB
01-36.txt AC 2 ms 2920 KiB
01-37.txt AC 2 ms 3284 KiB
01-38.txt AC 2 ms 3184 KiB
01-39.txt AC 2 ms 3076 KiB
01-40.txt AC 2 ms 3228 KiB
01-41.txt AC 2 ms 3080 KiB
01-42.txt AC 1 ms 3268 KiB
01-43.txt AC 2 ms 3032 KiB
01-44.txt AC 1 ms 3192 KiB
01-45.txt AC 2 ms 3256 KiB
01-46.txt AC 2 ms 3060 KiB
01-47.txt AC 1 ms 3180 KiB
01-48.txt AC 3 ms 3132 KiB
01-49.txt AC 2 ms 3056 KiB
01-50.txt AC 2 ms 3144 KiB
01-51.txt AC 2 ms 3228 KiB
01-52.txt AC 2 ms 3148 KiB
01-53.txt AC 2 ms 3380 KiB
01-54.txt AC 2 ms 3068 KiB
01-55.txt AC 2 ms 3212 KiB
01-56.txt AC 2 ms 3032 KiB
01-57.txt AC 2 ms 3048 KiB
01-58.txt AC 1 ms 3272 KiB
01-59.txt AC 2 ms 3176 KiB
01-60.txt AC 1 ms 3036 KiB
01-61.txt AC 2 ms 3020 KiB
01-62.txt AC 1 ms 3128 KiB
01-63.txt AC 2 ms 3192 KiB
01-64.txt AC 2 ms 3252 KiB
01-65.txt AC 2 ms 3112 KiB
01-66.txt AC 2 ms 3052 KiB
01-67.txt AC 2 ms 3272 KiB
01-68.txt AC 2 ms 3244 KiB
01-69.txt AC 2 ms 3208 KiB
01-70.txt AC 2 ms 3228 KiB
01-71.txt AC 2 ms 3168 KiB
01-72.txt AC 2 ms 3164 KiB
01-73.txt AC 2 ms 3256 KiB
01-74.txt AC 2 ms 3244 KiB
01-75.txt AC 1 ms 3152 KiB
01-76.txt AC 2 ms 3212 KiB
01-77.txt AC 2 ms 3252 KiB
01-78.txt AC 2 ms 2908 KiB
01-79.txt AC 2 ms 3100 KiB
01-80.txt AC 2 ms 3240 KiB
01-81.txt AC 2 ms 3352 KiB
01-82.txt AC 2 ms 3132 KiB
01-83.txt AC 2 ms 3388 KiB
02-0.txt AC 6 ms 3180 KiB
03-0.txt AC 116 ms 3840 KiB
03-1.txt AC 86 ms 3824 KiB
03-2.txt AC 79 ms 3836 KiB