QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#570140 | #9315. Rainbow Bracket Sequence | FangYifan | WA | 1ms | 3916kb | C++17 | 4.5kb | 2024-09-17 14:13:37 | 2024-09-17 14:13:43 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = double;
constexpr int mod = 998244353;
constexpr int N = 1e6 + 10;
template <class T>
struct MinCostFlow {
struct _Edge {
int v;
T cap, cost;
_Edge(int v, T cap, T cost) : v(v), cap(cap), cost(cost) {}
};
int n;
T inf;
vector<_Edge> e; // e[i] 存编号为 i 的边所指向的节点 v / 流量 cap / 单位流量费用 cost
vector<vector<int>> g; // g[u] 存储了所有以 u 为起点的边 u -> v 的编号 i
vector<T> h; // h[u] 表示节点 u 的势函数, u -> v 的边权由 c 变成了 c + h[u] - h[v]
vector<T> dis; // dis[t] 表示从 S 出发到达 T 的最短路径长度 (路径 单位流量 费用之和)
vector<int> pre; // pre[v] 表示流经过了 u -> v 这条边, 记录流向 v 的这条边的编号 i
MinCostFlow(int n) { init(n); }
void init(int n) {
this->n = n;
e.clear();
g.assign(n + 1, {});
inf = numeric_limits<T>::max();
}
// 每次增广出一条 S 到 T 的最短路径, 边权为单位流量费用
bool dij(int s, int t) {
dis.assign(n + 1, inf);
pre.assign(n + 1, -1);
priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>> q;
dis[s] = 0;
q.emplace(0, s);
while (!q.empty()) {
auto [d, u] = q.top();
q.pop();
if (dis[u] != d) continue;
for (int i : g[u]) {
auto [v, cap, cost] = e[i];
if (cap > 0 && dis[v] > d + h[u] - h[v] + cost) {
dis[v] = d + h[u] - h[v] + cost;
pre[v] = i;
q.emplace(dis[v], v);
}
}
}
return dis[t] != inf;
}
void add(int u, int v, T cap, T cost) {
g[u].push_back(e.size());
e.emplace_back(v, cap, cost);
g[v].push_back(e.size());
e.emplace_back(u, 0, -cost);
}
pair<T, T> flow(int s, int t) {
T flow = 0;
T cost = 0;
h.assign(n + 1, 0);
while (dij(s, t)) {
for (int i = 1; i <= n; i++) h[i] += dis[i];
// 回溯增广路径, 求路径最小容量(本次的增广流量)
T aug = inf;
for (int i = t; i != s; i = e[pre[i] ^ 1].v) {
aug = min(aug, e[pre[i]].cap);
}
// 更新增广路径上边的容量
for (int i = t; i != s; i = e[pre[i] ^ 1].v) {
e[pre[i]].cap -= aug;
e[pre[i] ^ 1].cap += aug;
}
flow += aug;
cost += aug * h[t];
}
return make_pair(flow, cost);
}
struct Edge {
int u, v;
T cap, cost, flow;
};
vector<Edge> edges() {
vector<Edge> ans;
for (int i = 0; i < (int)e.size(); i += 2) {
Edge x;
x.u = e[i + 1].v;
x.v = e[i].v;
x.cap = e[i].cap + e[i + 1].cap;
x.cost = e[i].cost;
x.flow = e[i + 1].cap;
ans.push_back(x);
}
return ans;
}
};
void solve() {
int n, m;
cin >> n >> m;
vector<int> l(m + 1);
for (int i = 1; i <= m; i++) cin >> l[i];
vector<int> col(2 * n + 1);
vector<vector<int>> pos(m + 1);
for (int i = 1; i <= 2 * n; i++) {
cin >> col[i];
pos[col[i]].push_back(i);
}
ll sum = 0;
vector<int> val(2 * n + 1);
for (int i = 1; i <= 2 * n; i++) {
cin >> val[i];
sum += val[i];
}
MinCostFlow<ll> f(2 * n + m + 3);
int S = 2 * n + m + 2, T = 2 * n + m + 3;
int O = 2 * n + m + 1;
f.add(S, O, n, 0);
for (int i = 1; i <= 2 * n; i++) f.add(O, i, 1, 0);
for (int i = 1; i <= 2 * n; i++) {
for (int j = i + 1; j <= 2 * n; j++) {
f.add(i, j, 1, 0);
}
}
for (int i = 1; i <= m; i++) {
for (auto j : pos[i]) {
f.add(j, 2 * n + i, 1, val[j]);
}
if (pos[i].size() < l[i]) {
cout << "-1\n";
return;
}
f.add(2 * n + i, T, pos[i].size() - l[i], 0);
}
auto [flow, cost] = f.flow(S, T);
cout << (flow == n ? sum - cost : -1) << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt = 1;
cin >> tt;
while (tt--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3884kb
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: 3916kb
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:
5220751523 374461155 2351080746 3678982693 2201471991 -1 1378573195 2596974815 1093935906 5001074851 545706543 4600692243 2231197660 3266162379 4640037833 5740148284 -1 1831202593 6488101105 4469810885 -1 4230243225 4836311506 2759956368 5751395565 6350958028 7789009332 -1 5054275471 1467678317 8839...
result:
wrong answer 1st numbers differ - expected: '-1', found: '5220751523'