提出 #70508492


ソースコード 拡げる

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


alias Op = Tuple!(int, "l0", int, "r0", int, "l1", int, "r1");
enum NO = [Op(-1, -1, -1, -1)];

Op[] solve(int N, const(int[]) A, const(int[]) B) {
  int[] xs, ys;
  foreach (i; 0 .. N) if (A[i]) xs ~= i;
  foreach (i; 0 .. N) if (B[i]) ys ~= i;
  if (xs.length != ys.length) return NO;
  if (xs.sum != ys.sum) return NO;
  if (xs.length > N - xs.length) {
    xs = [];
    ys = [];
    foreach (i; 0 .. N) if (!A[i]) xs ~= i;
    foreach (i; 0 .. N) if (!B[i]) ys ~= i;
  }
  debug writeln(xs, " -> ", ys);
  const K = cast(int)(xs.length);
  int[] incs, decs;
  for (int i = 0, j, k; i < K; i = k) {
    for (j = i; j < K && xs[j] <= ys[j]; ++j) {}
    for (k = j; k < K && xs[k] >= ys[k]; ++k) {}
    foreach_reverse (l; i .. j) incs ~= l;
    foreach (l; j .. k) decs ~= l;
  }
  Op[] ops;
  for (int i, j; ; ) {
    for (; i < incs.length && xs[incs[i]] == ys[incs[i]]; ++i) {}
    for (; j < decs.length && xs[decs[j]] == ys[decs[j]]; ++j) {}
    if (i == incs.length || j == decs.length) break;
    const t = min(ys[incs[i]] - xs[incs[i]], xs[decs[j]] - ys[decs[j]]);
    assert(t > 0);
    Op op = Op(xs[incs[i]], xs[incs[i]] + t + 1, xs[decs[j]] - t, xs[decs[j]] + 1);
    if (op.l0 > op.l1) {
      swap(op.l0, op.l1);
      swap(op.r0, op.r1);
    }
    ops ~= op;
    xs[incs[i]] += t;
    xs[decs[j]] -= t;
  }
  assert(xs == ys);
  return ops;
}

void main() {
  try {
    for (; ; ) {
      const numCases = readInt;
      foreach (caseId; 0 .. numCases) {
        const N = readInt;
        auto A = new int[N]; foreach (i; 0 .. N) A[i] = readInt;
        auto B = new int[N]; foreach (i; 0 .. N) B[i] = readInt;
        
        const ans = solve(N, A, B);
        if (ans != NO) {
          writeln("Yes");
          writeln(ans.length);
          foreach (Op op; ans) {
            writeln(op.l0 + 1, " ", op.r0, " ", op.l1 + 1, " ", op.r1);
          }
        } else {
          writeln("No");
        }
      }
    }
  } catch (EOFException e) {
  }
}

提出情報

提出日時
問題 B - Swap if Equal Length and Sum
ユーザ hos_lyric
言語 D (LDC 1.32.2)
得点 800
コード長 3247 Byte
結果 AC
実行時間 37 ms
メモリ 19240 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 800 / 800
結果
AC × 1
AC × 47
セット名 テストケース
Sample sample.txt
All 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_4.txt, random_5.txt, random_6.txt, random_7.txt, random_8.txt, random_9.txt, sample.txt, small_1.txt, small_10.txt, small_11.txt, small_12.txt, small_13.txt, small_14.txt, small_15.txt, small_16.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
ケース名 結果 実行時間 メモリ
random_1.txt AC 22 ms 12712 KiB
random_10.txt AC 31 ms 12632 KiB
random_11.txt AC 14 ms 10820 KiB
random_12.txt AC 29 ms 13380 KiB
random_13.txt AC 35 ms 11936 KiB
random_14.txt AC 22 ms 13184 KiB
random_15.txt AC 20 ms 13300 KiB
random_16.txt AC 28 ms 13364 KiB
random_17.txt AC 21 ms 9188 KiB
random_18.txt AC 36 ms 12016 KiB
random_19.txt AC 21 ms 10708 KiB
random_2.txt AC 16 ms 11476 KiB
random_20.txt AC 31 ms 13176 KiB
random_21.txt AC 25 ms 12224 KiB
random_22.txt AC 20 ms 17812 KiB
random_23.txt AC 37 ms 13148 KiB
random_24.txt AC 25 ms 12484 KiB
random_25.txt AC 26 ms 12712 KiB
random_26.txt AC 34 ms 12504 KiB
random_27.txt AC 16 ms 10504 KiB
random_28.txt AC 24 ms 7304 KiB
random_29.txt AC 31 ms 11940 KiB
random_3.txt AC 19 ms 12496 KiB
random_30.txt AC 19 ms 11772 KiB
random_4.txt AC 25 ms 13156 KiB
random_5.txt AC 18 ms 12204 KiB
random_6.txt AC 17 ms 10928 KiB
random_7.txt AC 33 ms 19240 KiB
random_8.txt AC 16 ms 11280 KiB
random_9.txt AC 30 ms 13076 KiB
sample.txt AC 1 ms 3040 KiB
small_1.txt AC 35 ms 3880 KiB
small_10.txt AC 36 ms 3756 KiB
small_11.txt AC 37 ms 3788 KiB
small_12.txt AC 36 ms 3944 KiB
small_13.txt AC 36 ms 3844 KiB
small_14.txt AC 36 ms 3844 KiB
small_15.txt AC 36 ms 3832 KiB
small_16.txt AC 8 ms 3748 KiB
small_2.txt AC 35 ms 3748 KiB
small_3.txt AC 34 ms 3736 KiB
small_4.txt AC 37 ms 3928 KiB
small_5.txt AC 37 ms 3776 KiB
small_6.txt AC 37 ms 3728 KiB
small_7.txt AC 37 ms 3876 KiB
small_8.txt AC 36 ms 3876 KiB
small_9.txt AC 36 ms 3800 KiB