提出 #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) {
}
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
800 / 800 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |