QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#566059 | #9315. Rainbow Bracket Sequence | lym | WA | 1ms | 4584kb | C++20 | 2.8kb | 2024-09-15 22:57:13 | 2024-09-15 22:57:16 |
Judging History
answer
#include<bits/stdc++.h>
using i64 = long long;
//最小费用最大流 - 最大费用最大流
// MCMF : minimum cost maximum flow
const int V = 2010;
const int E = 20100;
template<typename T>
struct MinCostGraph {
int s, t, vtot, etot, cur[V], head[V], pre[V];
T dis[V], flow, cost;
bool vis[V];
struct edge {
int v, nxt;
T f, c;
} e[E * 2];
void addedge(int u, int v, T f, T c, T f2 = 0) {
e[etot] = {v, head[u], f, c}; head[u] = etot ++;
e[etot] = {u, head[v], f2, -c}; head[v] = etot ++;
}
bool spfa() {
T inf = std::numeric_limits<T>::max() / 2;
for (int i = 1; i <= vtot; i ++) {
dis[i] = inf;
vis[i] = false;
pre[i] = -1;
}
dis[s] = 0, vis[s] = true;
std::queue<int> q; q.push(s);
while (! q.empty()) {
int u = q.front();
for (int i = head[u]; ~i; i = e[i].nxt) {
int v = e[i].v;
if (e[i].f && dis[v] > dis[u] + e[i].c) {
dis[v] = dis[u] + e[i].c;
pre[v] = i;
if (! vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
q.pop();
vis[u] = false;
}
return dis[t] != inf;
}
void augment() {
int u = t;
T f = std::numeric_limits<T>::max();
while (~ pre[u]) {
f = std::min(f, e[pre[u]].f);
u = e[pre[u] ^ 1].v;
}
flow += f;
cost += f * dis[t];
u = t;
while (~ pre[u]) {
e[pre[u]].f -= f;
e[pre[u] ^ 1].f += f;
u = e[pre[u] ^ 1].v;
}
}
std::array<T, 2> solve() {
flow = 0;
cost = 0;
while (spfa()) augment();
return {flow, cost};
}
void init(int _s, int _t, int _vtot) {
s = _s;
t = _t;
vtot = _vtot;
etot = 0;
for (int i = 1; i <= vtot; i ++) {
head[i] = -1;
}
}
};
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<int> cnt(m + 1), all(m + 1), rightbr(m + 1), c(2 * n + 1), val(2 * n + 1);
for (int i = 1; i <= m; i ++) {
std::cin >> cnt[i];
}
for (int i = 1; i <= 2 * n; i ++) {
std::cin >> c[i];
all[c[i]] ++;
}
i64 sum = 0;
for (int i = 1; i <= 2 * n; i ++) {
std::cin >> val[i];
sum += val[i];
}
for (int i = 1; i <= m; i ++) {
rightbr[i] = all[i] - cnt[i];
if (rightbr[i] < 0) {
std::cout << -1 << '\n';
return ;
}
}
int s = n * 2 + m + 1, t = s + 1;
MinCostGraph<i64> g;
g.init(s, t, t);
g.addedge(s, n * 2, n, 0);
for (int i = n * 2; i > 1; i --) {
g.addedge(i, i - 1, n, 0);
g.addedge(i, n * 2 + c[i], 1, val[i]);
}
g.addedge(1, n * 2 + c[1], 1, val[1]);
for (int i = 1; i <= m; i ++) {
g.addedge(n * 2 + i, t, rightbr[i], 0);
}
auto it = g.solve();
if (it[0] < n) {
std::cout << -1 << '\n';
return ;
}
std::cout << sum - it[1] << '\n';
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t = 1;
std::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: 4584kb
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: 4516kb
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'