QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#455874 | #892. Minimal Cut | YeahPotato | WA | 1ms | 12528kb | C++14 | 3.0kb | 2024-06-26 22:48:00 | 2024-06-26 22:48:01 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> pii;
const int N = 20004, NN = N * 72;
int n, m, u, v, w, s[N], c[N], nodes, root[N], ls[NN], rs[NN], tag[NN], fa[N], siz[N];
pii tree[NN]; basic_string <pii> adj[N]; long long ans;
struct E {
int u, v, w;
bool operator < (const E &e) const {
return w > e. w;
}
} edge[N];
pii operator + (const pii &a, const int &b) {
return pii (a. first + b, a. second);
}
void pushup(int rt) {
tree[rt] = min(tree[ls[rt]], tree[rs[rt]]) + tag[rt];
}
void push(int rt, int z) {
tree[rt] = tree[rt] + z, tag[rt] += z;
}
void build(int &rt, int l, int r) {
rt = ++ nodes;
if (l == r) return void (tree[rt] = pii (c[l], l));
int mid = l + r >> 1;
build(ls[rt], l, mid), build(rs[rt], mid+1, r);
pushup(rt);
}
void update(int lrt, int &rt, int l, int r, int x, int y, int z) {
rt = ++ nodes, ls[rt] = ls[lrt], rs[rt] = rs[lrt], tree[rt] = tree[lrt], tag[rt] = tag[lrt];
if (l == x && r == y) return push(rt, z);
int mid = l + r >> 1;
if (y <= mid) update(ls[lrt], ls[rt], l, mid, x, y, z);
else if (x > mid) update(rs[lrt], rs[rt], mid+1, r, x, y, z);
else update(ls[lrt], ls[rt], l, mid, x, mid, z), update(rs[lrt], rs[rt], mid+1, r, mid+1, y, z);
pushup(rt);
}
pii query(int rt, int l, int r, int x, int y) {
if (l == x && r == y) return tree[rt];
int mid = l + r >> 1;
if (y <= mid) return query(ls[rt], l, mid, x, y) + tag[rt];
else if (x > mid) return query(rs[rt], mid+1, r, x, y) + tag[rt];
else return min(query(ls[rt], l, mid, x, mid), query(rs[rt], mid+1, r, mid+1, y)) + tag[rt];
}
void solve(int u, int l, int r) {
if (l > r) return ;
pii c = min(pii (s[u], r + 1), l == r ? pii (s[r], r + 1) : r == n ? min(query(root[l], 1, n, l + 1, r), pii (:: c[l], r + 1)) : query(root[l], 1, n, l + 1, r + 1));
edge[++m] = (E) {u, l, c. first}, solve(l, l + 1, c. second - 1), solve(u, c. second, r);
}
int find(int u) {
return u == fa[u] ? u : fa[u] = find(fa[u]);
}
int main() {
cin >> n >> m;
for (int i=1; i<=m; i++)
scanf ("%d%d%d", &u, &v, &w), adj[u] += pii (v, w), adj[v] += pii (u, w), s[u] += w, s[v] += w;
for (int i=2; i<=n; i++) {
c[i] = c[i-1];
for (pii e : adj[i-1])
c[i] += (e. first >= i ? 1 : - 1) * e. second;
} build(root[1], 1, n);
for (int i=2; i<=n; i++) {
root[i] = root[i-1];
int s = 0;
for (pii e : adj[i-1]) {
int j = e. first, w = e. second;
if (j >= i) s += w, update(root[i], root[i], 1, n, i, j, - w << 1);
else s -= w, update(root[i], root[i], 1, n, j + 1, i - 1, w << 1);
} push(root[i], s);
}
pii c = query(root[1], 1, n, 2, n);
edge[m=1] = (E) {1, n, c. first}, solve(1, 2, c. second - 1), solve(c. second, c. second + 1, n);
for (int i=1; i<=n; i++)
fa[i] = i, siz[i] = 1;
sort (edge+1, edge+n);
for (int i=1; i<n; i++) {
int u = find(edge[i]. u), v = find(edge[i]. v);
ans += 1ll * siz[u] * siz[v] * edge[i]. w, fa[v] = u, siz[u] += siz[v];
} cout << (ans + 1000000000ll * n * (n - 1)) % 998244353;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 12528kb
input:
4 2 1 3 2 2 4 2
output:
21067776
result:
ok "21067776"
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 8632kb
input:
79 190 24 30 8372 16 17 3623 47 43 577 47 45 10000 50 49 9644 35 25 882 23 24 1994 54 55 7778 32 33 230 52 53 6078 5 10 8214 25 26 6829 21 22 340 67 68 6066 10 1 8104 9 10 3085 44 43 5659 33 34 5505 7 10 337 12 13 3804 5 1 4735 25 28 6650 61 60 9290 14 6 9857 38 35 6228 48 49 3076 60 59 4972 54 52 4...
output:
845080662
result:
wrong answer 1st words differ - expected: '844859152', found: '845080662'