結果
問題 | No.1502 Many Simple Additions |
ユーザー |
|
提出日時 | 2021-06-08 09:19:31 |
言語 | D (dmd 2.109.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 11,474 bytes |
コンパイル時間 | 1,593 ms |
コンパイル使用メモリ | 150,192 KB |
実行使用メモリ | 24,976 KB |
最終ジャッジ日時 | 2024-06-22 11:26:32 |
合計ジャッジ時間 | 13,031 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 16 WA * 20 TLE * 3 |
コンパイルメッセージ
Main.d(539): Deprecation: function `Main.IO!(makeGlobal, makeGlobal).IO.put!("{}", ModInt!1000000007).put.putMain!(c, ModInt!1000000007).putMain` function requires a dual-context, which is deprecated Main.d-mixin-509(509): instantiated from here: `putMain!(c, ModInt!1000000007)` Main.d(90): instantiated from here: `put!("{}", ModInt!1000000007)`
ソースコード
// URL: https://yukicoder.me/problems/no/1502import std.algorithm, std.array, std.bitmanip, std.container, std.conv, std.format,std.functional, std.math, std.range, std.traits, std.typecons, std.stdio, std.string;version(unittest) {} elsevoid main(){int N, M, K; io.getV(N, M, K);auto g = GraphW!int(N);foreach (_; 0..M) {int Xi, Yi, Zi; io.getV(Xi, Yi, Zi); --Xi; --Yi;g.addEdgeB(Xi, Yi, Zi);}auto check(int a, int av){auto mi = av, ma = av, b = new int[](N), visited = new bool[](N);auto q = DList!int(a);b[a] = av; visited[a] = true;while (!q.empty) {auto u = q.front; q.removeFront();foreach (e; g[u]) {auto v = e.dst, bv = e.wt - b[u];if (visited[v]) {if (b[v] != bv) return -1;} else {b[v] = bv;visited[v] = true;q.insertBack(v);mi.minU(bv);ma.maxU(bv);}}}return mi < 1 ? -1 : ma;}auto c0 = mint(1), c1 = mint(1);auto b = new int[](N), d = new int[](N), visited = new bool[](N);foreach (i; 0..N) {if (visited[i]) continue;auto q = DList!int(i), mi0 = 1, ma0 = K, mi1 = 1, ma1 = K-1;visited[i] = true;loop: while (!q.empty) {auto u = q.front; q.removeFront();foreach (e; g[u]) {auto v = e.dst, bv = e.wt - b[u];if (visited[v]) {if (d[v]%2 == (d[u]+1)%2) {if (b[v] != bv || (b[v]+bv)%2 == 1) {c0 = 0; c1 = 0;break loop;}} else {if ((b[v]+bv)%2 == 1) {c0 = 0;c1 = 0;break loop;} else {auto k = check(v, bv);if (k > K) c0 = 0;if (k > K-1) c1 = 0;break loop;}}} else {b[v] = bv;d[v] = d[u] + 1;visited[v] = true;if (d[v]%2 == 1) {mi0.maxU(bv - K);ma0.minU(bv - 1);mi1.maxU(bv - (K-1));ma1.minU(bv - 1);} else {mi0.maxU(1 - bv);ma0.minU(K - bv);mi1.maxU(1 - bv);ma1.minU((K-1) - bv);}q.insertBack(v);}}}c0 *= max(0, ma0-mi0+1);c1 *= max(0, ma1-mi1+1);}io.put(c0 - c1);}const mod = 10^^9+7;alias mint = ModInt!mod;pragma(inline) pure nothrow @nogc @safe{T minU(T, U)(ref T a, U b){ return a = min(a, b); }T maxU(T, U)(ref T a, U b){ return a = max(a, b); }}pure nothrow @safe{T powr(alias pred = "a*b", T, U)(const T a, U n, T one)if (isIntegral!U){auto b = T(a);alias predFun = binaryFun!pred;if (n == 0) return one;auto r = one;for (; n > 0; n >>= 1) {if (n&1) r = predFun(r, b);b = predFun(b, b);}return r;}T powr(alias pred = "a*b", T, U)(const T a, U n)if (isIntegral!U){return powr!(pred, T, U)(a, n, T(1));}}pragma(inline) pure nothrow @nogc @safe{T cdiv(T)(const T a, const T b){return (a+b-1)/b;}T pmod(T)(const T a, const T b){return a >= 0 ? a%b : a%b+b;}}pure nothrow @nogc @safe{ExtGcdResult!T extGcd(T)(const T a, const T b){if (a == 0) {return ExtGcdResult!T(T(b), T(0), T(1));} else {auto r = extGcd(b%a, a);return ExtGcdResult!T(r.gcd, r.y-(b/a)*r.x, r.x);}}private struct ExtGcdResult(T){T gcd, x, y;}}struct ModInt(int m){pragma(inline) pure nothrow @nogc @safe{this(T)(T v)if (isIntegral!T){i = nm(v);}this(ref return scope const Mint v){i = v.i;}bool opEquals(T)(T v) constif (isIntegral!T){return i == v;}bool opEquals(const Mint v) const{return i == v.i;}Mint opUnary(string op: "-")() const{return Mint(-i);}static if (m < int.max/2) {Mint opBinary(string op: "+")(int r) const{Mint m;m.i = nm(i+r);return m;}Mint opBinary(string op: "+")(const Mint r) const{Mint m;m.i = nmp(i+r.i);return m;}ref Mint opOpAssign(string op: "+")(int r){i = nm(i+r);return this;}ref Mint opOpAssign(string op: "+")(const Mint r){i = nmp(i+r.i);return this;}} else {Mint opBinary(string op: "+")(int r) const{Mint m;m.i = nm(l+r);return m;}Mint opBinary(string op: "+")(const Mint r) const{Mint m;m.i = nmp(l+r.i);return m;}ref Mint opOpAssign(string op: "+")(int r){i = nm(l+r);return this;}ref Mint opOpAssign(string op: "+")(const Mint r){i = nmp(l+r.i);return this;}}Mint opBinary(string op: "-")(int r) const{return Mint(i-r);}Mint opBinary(string op: "-")(const Mint r) const{return Mint(i-r.i);}ref Mint opOpAssign(string op: "-")(int r){i = nm(i-r);return this;}ref Mint opOpAssign(string op: "-")(const Mint r){i = nm(i-r.i);return this;}Mint opBinary(string op, T)(T r) constif ((op == "+" || op == "-") && isIntegral!T && !is(T == int)){return Mint(mixin("l"~op~"r"));}ref Mint opOpAssign(string op, T)(T r)if ((op == "+" || op == "-") && isIntegral!T && !is(T == int)){i = nm(mixin("l"~op~"r"));return this;}Mint opBinary(string op: "*", T)(T r) constif (isIntegral!T){Mint m;m.i = nm(l*r);return m;}Mint opBinary(string op: "*")(const Mint r) const{Mint m;m.i = nmp(l*r.i);return m;}ref Mint opOpAssign(string op: "*", T)(T r)if (isIntegral!T){i = nm(l*r);return this;}ref Mint opOpAssign(string op: "*")(const Mint r){i = nmp(l*r.i);return this;}ref Mint opUnary(string op: "++")(){i = nmp(i+1);return this;}ref Mint opUnary(string op: "--")(){i = nm(i-1);return this;}Mint opBinary(string op: "^^", T)(T n)if (isIntegral!T){return powr(this, n, Mint(1));}Mint opBinary(string op: "/")(const Mint r) const{return Mint(l*r.inv.i);}ref Mint opOpAssign(string op: "/")(const Mint r){i = nm(l*r.inv.i);return this;}Mint opBinary(string op: "/", T)(T r) constif (isIntegral!T){return opBinary!op(Mint(r));}ref Mint opOpAssign(string op: "/", T)(T r)if (isIntegral!T){return opOpAssign!op(Mint(r));}Mint inv() const{return Mint(extGcd(i, m).x);}}pure nothrow @nogc @safe{ref Mint opAssign(T)(T v)if (isIntegral!T){i = nm(v);return this;}ref Mint opAssign(const Mint v){i = v.i;return this;}}pure nothrow @safe{string toString() const{return i.to!string;}}private{alias Mint = ModInt!m;version(BigEndian) union { long l; struct { int i2; int i; } }else union { long l; int i; }pragma(inline) pure nothrow @nogc @safe{int nm(T)(T v) constif (isIntegral!T){return cast(int)pmod(v, m);}int nmp(T)(T v) constif (isIntegral!T){return cast(int)(v%m);}}}}struct Graph{alias Node = int;Node n;Node[][] g;alias g this;pure nothrow @safe{this(Node n){this.n = n;g = new Node[][](n);}void addEdge(Node u, Node v)in { assert(0 <= u && u < n && 0 <= v && v < n); }do{g[u] ~= v;}void addEdgeB(Node u, Node v)in { assert(0 <= u && u < n && 0 <= v && v < n); }do{g[u] ~= v;g[v] ~= u;}}}struct GraphW(W = int, W i = 10^^9){alias Node = int, Wt = W, inf = i;struct Edge{Node src, dst;Wt wt;alias cap = wt;}Node n;Edge[][] g;alias g this;pure nothrow @safe{this(Node n){this.n = n;g = new Edge[][](n);}void addEdge(Node u, Node v, Wt w)in { assert(0 <= u && u < n && 0 <= v && v < n); }do{g[u] ~= Edge(u, v, w);}void addEdgeB(Node u, Node v, Wt w)in { assert(0 <= u && u < n && 0 <= v && v < n); }do{g[u] ~= Edge(u, v, w);g[v] ~= Edge(v, u, w);}}}struct GraphM(W = int, W i = 10^^9){alias Node = int, Wt = W, inf = i;Node n;Wt[][] g;alias g this;pure nothrow @safe{this(int n){this.n = n;g = new Wt[][](n, n);}static GraphM!(W, i) init(Node n){auto g = GraphM!(W, i)(n);foreach (i; 0..n) { g[i][] = inf; g[i][i] = 0; }return g;}}}auto io = IO!()();import std.stdio;struct IO(alias IN = stdin, alias OUT = stdout){import std.meta : allSatisfy;import core.stdc.stdlib : exit;void getV(T...)(ref T v){foreach (ref w; v) get(w);}void getA(T)(size_t n, ref T v)if (hasAssignableElements!T){v = new T(n);foreach (ref w; v) get(w);}void getC(T...)(size_t n, ref T v)if (allSatisfy!(hasAssignableElements, T)){foreach (ref w; v) w = new typeof(w)(n);foreach (i; 0..n) foreach (ref w; v) get(w[i]);}void getM(T)(size_t r, size_t c, ref T v)if (hasAssignableElements!T && hasAssignableElements!(ElementType!T)){v = new T(r);foreach (ref w; v) getA(c, w);}template getS(E...){void getS(T)(size_t n, ref T v){v = new T(n);foreach (ref w; v) foreach (e; E) mixin("get(w."~e~");");}}const struct PutConf{bool newline = true, flush, exit;string floatFormat = "%.10f", delimiter = " ";}void put(alias conf = "{}", T...)(T v){mixin("const PutConf c = "~conf~"; putMain!c(v);");}void putB(alias conf = "{}", S, T)(bool c, S t, T f){if (c) put!conf(t);else put!conf(f);}void putRaw(T...)(T v){OUT.write(v);OUT.writeln;}private{dchar[] buf;auto sp = (new dchar[](0)).splitter;void nextLine(){IN.readln(buf);sp = buf.splitter;}void get(T)(ref T v){if (sp.empty) nextLine();v = sp.front.to!T;sp.popFront();}void putMain(PutConf c, T...)(T v){foreach (i, w; v) {putOne!c(w);if (i+1 < v.length) OUT.write(c.delimiter);}static if (c.newline) OUT.writeln;static if (c.flush) OUT.flush();static if (c.exit) exit(0);}void putOne(PutConf c, T)(T v){static if (isInputRange!T && !isSomeString!T) putRange!c(v);else static if (isFloatingPoint!T) OUT.write(format(c.floatFormat, v));else static if (hasMember!(T, "fprint")) v.fprint(OUT);else OUT.write(v);}void putRange(PutConf c, T)(T v){auto w = v;while (!w.empty) {putOne!c(w.front); w.popFront();if (!w.empty) OUT.write(c.delimiter);}}}}