QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#568494 | #9315. Rainbow Bracket Sequence | Saanteye | WA | 1ms | 3724kb | C++20 | 3.5kb | 2024-09-16 16:45:20 | 2024-09-16 16:45:21 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
mt19937_64 rnd(time(0));
using i64 = long long;
const int N = 1e5 + 10;
struct MCFGraph {
struct Edge {
int v, c, f;
Edge(int v, int c, int f) : v(v), c(c), f(f) {}
};
const int n;
vector<Edge> e;
vector<vector<int>> g;
vector<i64> h, dis;
vector<int> pre;
bool dijkstra(int s, int t) {
dis.assign(n, numeric_limits<i64>::max());
pre.assign(n, -1);
priority_queue<pair<i64, int>, vector<pair<i64, int>>, greater<pair<i64, int>>> que;
dis[s] = 0;
que.emplace(0, s);
while (!que.empty()) {
i64 d = que.top().first;
int u = que.top().second;
que.pop();
if (dis[u] < d) continue;
for (int i : g[u]) {
auto [v,c,f] = e[i];
if (c > 0 && dis[v] > d + h[u] - h[v] + f) {
dis[v] = d + h[u] - h[v] + f;
pre[v] = i;
que.emplace(dis[v], v);
}
}
}
return dis[t] != numeric_limits<i64>::max();
}
MCFGraph(int n) : n(n), g(n) {}
void addEdge(int u, int v, int c, int f) {
g[u].push_back(e.size());
e.emplace_back(v,c,f);
g[v].push_back(e.size());
e.emplace_back(u, 0, -f);
}
pair<int, i64> flow(int s, int t) {
int flow = 0;
i64 cost = 0;
h.assign(n, 0);
while (dijkstra(s, t)) {
for (int i = 0; i < n; i++) h[i] += dis[i];
int aug = numeric_limits<int>::max();
for (int i = t; i != s; i = e[pre[i] ^ 1].v) aug = min(aug, e[pre[i]].c);
for (int i = t; i != s; i = e[pre[i] ^ 1].v) {
e[pre[i]].c -= aug;
e[pre[i] ^ 1].c += aug;
}
flow += aug;
cost += i64(aug) * h[t];
}
return make_pair(flow, cost);
}
};
void solve() {
int n, m;
cin >> n >> m;
vector<int> l(m);
for (int i = 0; i < m; i++) cin >> l[i];
vector<int> c(2 * n), v(2 * n);
for (int i = 0; i < 2 * n; i++) cin >> c[i];
for (int i = 0; i < 2 * n; i++) c[i]--;
for (int i = 0; i < 2 * n; i++) cin >> v[i];
MCFGraph mCFGraph(2 * n + m + 2 + 1);
int S = 2 * n + m, T = 2 * n + m + 1;
int M = 2 * n + m + 2;
mCFGraph.addEdge(S, 0, 2 * n, 0);
for (int i = 0; i < 2 * n - 1; i++) {
mCFGraph.addEdge(i, i + 1, 2 * n - i / 2 - 1, -1e14);
mCFGraph.addEdge(i, 2 * n + c[i], 1, -v[i]);
}
mCFGraph.addEdge(2 * n - 1, 2 * n + c[2 * n - 1], 1, -v[2 * n - 1]);
mCFGraph.addEdge(2 * n - 1, T, n, -1e14);
mCFGraph.addEdge(M, T, 2e9, 1e14);
for (int i = 0; i < m; i++) {
mCFGraph.addEdge(2 * n + i, T, l[i], 0);
mCFGraph.addEdge(2 * n + i, M, 2e9, 1e14);
}
auto [flow, cost] = mCFGraph.flow(S, T);
// cout << flow << ' ' << cost % (int)(1e14) << '\n';
int sum = 0;
for (auto x : l) sum += x;
int use = mCFGraph.e[mCFGraph.g[M][0] ^ 1].c;
// cout << use << '\n';
if (n - sum != use) {
cout << "-1\n";
return;
}
cost -= use * 1e14;
cost %= (int)(-1e14);
cout << -cost << '\n';
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3696kb
input:
2 3 2 1 2 1 2 2 2 1 2 3 1 4 2 2 1 3 2 2 2 1 2 2 2 1 2 3 1 4 2 2 1
output:
9 -1
result:
ok 2 number(s): "9 -1"
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 3724kb
input:
50 8 6 0 2 2 0 3 1 3 5 1 1 5 3 5 2 3 2 2 1 2 2 4 6 998133227 879226371 59632864 356493387 62611196 827258251 296576565 204244054 812713672 780267148 614679390 447700005 102067050 544546349 116002772 761999375 1 1 1 1 1 343766215 374461155 3 1 2 1 1 1 1 1 1 796323508 303640854 701432076 853325162 610...
output:
-1 343766215 2108469765 2908724240 -1 -1 1351561190 1697168127 1013080942 4656646546 -1 -1 1318315654 2526875689 2902004586 3047392676 -1 1046749330 4966409736 2742342996 -1 2845557406 -1 1437405472 4519905420 4753361248 5178876216 -1 3695705452 1098586149 883992368 -1 -1 3461318070 -1 1397782600 50...
result:
wrong answer 3rd numbers differ - expected: '2351080746', found: '2108469765'