QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#745970 | #9352. Highway Buses | viq2347 | WA | 16ms | 85824kb | C++14 | 2.8kb | 2024-11-14 12:45:01 | 2024-11-14 12:45:02 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
enum { _n = 200007, _m = 55 };
using ll = int64_t;
u32string G[_n], EX, E[_n];
int ex, siz[_n], R, up[_n], dth;
bitset<_n> B;
void dfs(int u, int p) {
for (siz[u] = 1; int v : G[u])
if (v != p)
dfs(v, u), siz[u] += siz[v];
}
u32string I[_n], D[_n], S[_n], P[_n];
vector<u32string> H[_n];
bool dfs1(int u, int p, int t, int d) {
int A = t - siz[u], k = 0, l = 0;
dth = max(dth, d), I[d] += u, D[u] += d;
for (int v : G[u])
if (v != p && ~B[v]) {
A = max(A, k = siz[v]);
if (dfs1(v, u, t, d + 1))
siz[u] = t - k, l = 1;
}
if (!R && 2 * A <= t) R = u, l = 1;
return l;
}
void dfs2(int u) {
I[0] += u, dth = 0;
for (B[u] = 1; int v : G[u])
if (~B[v])
dfs1(v, R = 0, siz[v], 1), up[R] = u, S[u] += R;
H[u].insert(H[u].end(), make_move_iterator(I), make_move_iterator(I + dth + 1));
for (int v : S[u]) dfs2(v);
}
struct NOD {
ll x;
mutable int i;
bool operator<(NOD $) const { return x > $.x; }
};
priority_queue<NOD> Q;
ll c1[_n], c2[_n], ret[_n], ans[_n];
int n, f[_n];
int d[_m][_n], cur1[_n], cur2[_n], cur0[_m];
void work(ll* c) {
for (ret[1] = 0, Q.push({ c[1], 1 });
!Q.empty();) {
auto [x, u] = Q.top();
Q.pop();
for (int i = 0; i < ex; ++i)
for (; cur0[i] < n; ++cur0[i]) {
int v = P[i][cur0[i]];
if (d[i][v] + d[i][u] > f[u]) break;
if (!~ret[v])
ret[v] = x, Q.push({ ret[v] + c[v], v });
}
for (int i = u, j = D[u].size(); --j, i; i = up[i])
while (cur1[i] < H[i].size()) {
int v = H[i][cur1[i]][cur2[i]];
if (cur1[i] + D[u][j] > f[u]) break;
if (!~ret[v])
ret[v] = x, Q.push({ ret[v] + c[v], v });
if (++cur2[i] == H[i][cur1[i]].size())
++cur1[i], cur2[i] = 0;
}
}
for (int i = 1; i <= n; ++i)
ans[i] = min(ans[i], ret[i]);
}
int g[_n];
int get(int x) { return g[x] ? g[x] = get(g[x]) : x; }
int q[_n], l, r, m, T;
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> T;
for (int i = 1, w; i <= n; ++i)
cin >> f[i] >> c1[i] >> w, c2[i] = c1[i] + w * ll(T - 1);
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v;
if (get(u) == get(v))
EX += u;
else
G[u] += v, G[v] += u, g[get(u)] = get(v);
E[u] += v, E[v] += u;
}
sort(&EX[0], &EX[EX.size()]);
EX.resize(ex = unique(&EX[0], &EX[EX.size()]) - &EX[0]);
for (int i = 0; i < ex; ++i) {
memset(d[i] + 1, -1, 4 * n);
d[i][EX[i]] = 0;
for (q[r = 1, l = 0] = EX[i]; l != r; ++l) {
int u = q[l];
P[i] += u;
for (int v : E[u]) ~d[i][v] ?: (d[i][v] = d[i][u] + 1, q[r++] = v);
}
}
dfs(1, 0), dfs2(1);
memset(ans + 1, 9, 8 * n);
memset(ret + 1, -1, 8 * n), work(c1);
bzero(cur0, 4 * ex), bzero(cur1 + 1, 4 * n), bzero(cur2 + 1, 4 * n);
memset(ret + 1, -1, 8 * n), work(c2);
for (int i = 1; i <= n; ++i) cout << ans[i] << '\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 57444kb
input:
6 6 2 1 50 -40 1 2 100 2 1 100 2 4 100 3 1 100 1 1 100 1 2 2 3 3 4 4 2 2 5 6 1
output:
0 10 52 52 52 10
result:
ok 6 lines
Test #2:
score: -100
Wrong Answer
time: 16ms
memory: 85824kb
input:
500 540 1000000 1 831790353 70 3 624594642 -127 2 189318946 -92 1 858646508 320 4 76999645 671 4 780012318 880 2 51254764 -12 2 420182468 -333 3 314764053 -36 1 560114854 -419 2 484412868 -31 3 466851594 6 4 535326027 732 4 430602789 578 1 605236859 43 4 633715178 896 3 110060408 -9 4 878946915 -654...
output:
0 1158491264 1166370876 1230036125 1166370876 1196112200 1192655096 1158491264 1208125266 1158491264 1158491264 1196497260 1246120727 1158491264 1158491264 1192655096 1196497260 1192655096 1154051011 1208125266 1165553259 1158491264 1196112200 1209885938 1158491264 1680607611 1158491264 1154051011 1...
result:
wrong answer 2nd lines differ - expected: '1277292628', found: '1158491264'