QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#667960 | #8938. Crawling on a Tree | Yansuan_HCl | WA | 0ms | 4508kb | C++20 | 2.8kb | 2024-10-23 10:09:08 | 2024-10-23 10:09:10 |
Judging History
answer
#include <bits/stdc++.h>
#define ms(x, v) memset(x, v, sizeof(x))
#define il __attribute__((always_inline)) static
#define U(i,l,r) for(int i(l),END##i(r);i<=END##i;++i)
#define D(i,r,l) for(int i(r),END##i(l);i>=END##i;--i)
using namespace std;
using ll = long long;
#define IC isdigit(c)
#define GC c=getchar()
void rd(auto &x) { x = 0; char GC; bool f = 0;
for (; !IC; GC) f |= c == '-';
for (; IC; GC) x = x * 10 + c - 48;
if (f) x = -x;
}
void rd(auto &x, auto &...y) { rd(x); rd(y...); }
#define meow(...) fprintf(stderr, __VA_ARGS__)
#define Assert(e, v) if (!(e)) { meow("AF@%d\n", __LINE__ ); exit(v); }
#define vc vector
#define eb emplace_back
#define pb push_back
const int N = 10004;
int n, m, c[N], cx[N];
using info = array<ll, N>;
void mkv(info &f, info &g, info &h) {
U (i, 1, m - 1) {
assert(f[i] - f[i - 1] <= f[i + 1] - f[i]);
assert(g[i] - g[i - 1] <= g[i + 1] - g[i]);
}
h[0] = f[0] + g[0];
int i = 1, j = 1, k = 1;
for (; k <= m; ++k) {
assert(i <= m);
assert(j <= m);
if (f[i] - f[i - 1] <= g[j] - g[j - 1]) {
h[k] = h[k - 1] + f[i] - f[i - 1];
++i;
} else {
h[k] = h[k - 1] + g[j] - g[j - 1];
++j;
}
}
U (i, 1, m - 1) {
if (h[i] - h[i - 1] > h[i + 1] - h[i])
exit(0);
}
}
using edge = array<int, 3>;
vc<edge> g[N];
int siz[N], hson[N];
void dfs0(int u, int f) {
siz[u] = 1; cx[u] = c[u];
for (auto [v, w, k] : g[u]) if (v != f) {
dfs0(v, u);
siz[u] += siz[v];
cx[u] = max(cx[u], cx[v]);
if (siz[v] > siz[hson[u]])
hson[u] = v;
}
}
void dp(int u, int fa, int fw, int fk, info &f) {
for (auto [v, w, k] : g[u]) if (v == hson[u]) {
dp(hson[u], u, w, k, f);
}
for (auto [v, w, k] : g[u]) if (v != fa && v != hson[u]) {
info x {}, y {};
dp(v, u, w, k, x);
mkv(f, x, y);
f = y;
}
U (y, 1, m) f[y] = min(f[y], f[y - 1]); // 留在 u
int lb = m + 1, rb = -1;
U (y, 0, m) {
int x = max(cx[u], y);
if (2 * x - y > fk) rb = y;
else break;
}
D (y, m, 0) {
int x = max(cx[u], y);
if (2 * x - y > fk) lb = y;
else break;
}
U (i, 0, rb) f[i] = (m - i + 1) * 1e14;
D (i, m, lb) f[i] = i * 1e14;
U (i, 1, m - 1) {
if (f[i] - f[i - 1] > f[i + 1] - f[i])
exit(0);
}
U (y, 0, m) {
int x = max(cx[u], y);
f[y] += (2 * x - y) * fw;
}
}
int main() {
// freopen("ava.in", "r", stdin);
rd(n, m);
U (i, 2, n) {
int u, v, w, k; rd(u, v, w, k);
g[u].pb({v, w, k});
g[v].pb({u, w, k});
}
U (i, 2, n)
rd(c[i]);
dfs0(1, 0);
info f {};
dp(1, 0, 0, 2e9, f);
info h; h.fill(1e18);
U (y, 0, m) {
int x = max(cx[1], y);
h[x] = min(h[x], f[y]);
}
U (x, 1, m) {
h[x] = min(h[x - 1], h[x]);
if (x < cx[1] || h[x] >= 1e14)
puts("-1");
else
printf("%lld\n", h[x]);
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 4508kb
input:
4 2 1 2 3 2 2 3 2 1 2 4 5 1 1 1 1
output:
-1 13
result:
ok 2 number(s): "-1 13"
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 4300kb
input:
4 2 1 2 3 2 2 3 2 1 2 4 5 1 2 2 2
output:
result:
wrong answer Answer contains longer sequence [length = 2], but output contains 0 elements