QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#571089 | #9315. Rainbow Bracket Sequence | numberes | WA | 0ms | 3692kb | C++20 | 2.6kb | 2024-09-17 20:27:53 | 2024-09-17 20:27:54 |
Judging History
answer
#include<bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>
#define mp make_pair
#define ll long long
#define fi first
#define se second
using namespace std;
struct node {
int to, cap, rev, cost;
node() : to(), cap(), rev(), cost() {}
node(int _to, int _cap, int _rev, int _cost) : to(_to), cap(_cap), rev(_rev), cost(_cost) {}
};
int n, m; const ll inf = 1e18;
vector<node> g[5005];
ll lev[5005]; bool vis[5005]; int iter[5005];
void add_edge(int fr, int to, int cap, int cost) {
g[fr].pb({to, cap, (int)g[to].size(), cost});
g[to].pb({fr, 0, (int)g[fr].size() - 1, -cost});
}
bool spfa(int s, int t) {
queue<int> q;
for(int i = 0; i <= n * 2 + m + 1; i++) lev[i] = inf;
lev[s] = 0; vis[s] = 1; q.push(s);
while(!q.empty()) {
int u = q.front(); q.pop(); vis[u] = 0;
for(auto nxt : g[u]) {
int v = nxt.to;
if(nxt.cap > 0 && lev[v] > lev[u] + nxt.cost) {
lev[v] = lev[u] + nxt.cost;
if(!vis[v]) {vis[v] = 1; q.push(v);}
}
}
}
return lev[t] != inf;
}
pair<int, ll> dfs(int u, int t, int flow) {
if(u == t) return mp(flow, 0);
vis[u] = 1;
for(int &i = iter[u]; i < (int)g[u].size(); i++) {
node &nxt = g[u][i]; int v = nxt.to; // 注意这里的引用
if(!vis[v] && nxt.cap > 0 && lev[v] == lev[u] + nxt.cost) {
pair<int, ll> tmp = dfs(v, t, min(flow, nxt.cap));
if(tmp.fi > 0) {
nxt.cap -= tmp.fi;
g[v][nxt.rev].cap += tmp.fi;
vis[u] = 0;
return mp(tmp.fi, tmp.se + nxt.cost);
}
}
}
vis[u] = 0; //别漏掉了
return mp(0, 0);
}
pair<int, ll> min_cost_max_flow(int s, int t) {
int flow = 0; ll sum = 0;
while(spfa(s, t)) {
memset(iter, 0, sizeof(iter));
pair<int, ll> cur;
while((cur = dfs(s, t, 1e9)).fi > 0) {
flow += cur.fi; sum += cur.fi * cur.se;
}
}
return mp(flow, sum);
}
int l[105], c[205], v[205];
vector<int> p[105];
int main() {
int t; cin >> t;
while(t--) {
cin >> n >> m; ll sum = 0;
for(int i = 0; i <= n * 2 + m + 1; i++) {
g[i].clear(); p[i].clear();
}
for(int i = 1; i <= m; i++)
cin >> l[i];
for(int i = 1; i <= n * 2; i++) {
cin >> c[i]; p[c[i]].pb(i);
}
for(int i = 1; i <= n * 2; i++) {
cin >> v[i]; sum += v[i];
}
add_edge(0, n * 2, n, 0);
for(int i = n * 2; i >= 2; i--) {
add_edge(i, i - 1, (i - 1) / 2, 0);
}
for(int i = 1; i <= m; i++) {
for(auto x : p[i])
add_edge(x, i + n * 2, 1, v[x]);
add_edge(i + n * 2, n * 2 + m + 1, (int)p[i].size() - l[i], 0);
}
pair<int, ll> ans = min_cost_max_flow(0, n * 2 + m + 1);
if(ans.fi != n) cout << -1 << endl;
else cout << sum - ans.se << endl;
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3592kb
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: 0ms
memory: 3692kb
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 2351080746 3426965219 -1 1497027962 1351561190 2539318868 1013080942 4656646546 -1 -1 2231197660 2719131728 3983627641 4712174168 3121174891 1046749330 6115214757 3920988203 3914858167 3902088946 -1 2566553992 5268471900 5977120748 7505501534 -1 5054275471 1467678317 883992368 104456298...
result:
wrong answer 6th numbers differ - expected: '-1', found: '1497027962'