QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#572395 | #9315. Rainbow Bracket Sequence | RUOHUI | WA | 1ms | 3672kb | C++20 | 3.1kb | 2024-09-18 14:17:31 | 2024-09-18 14:17:31 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define pii pair<int,int>
using namespace std;
bool debug = 1;
#define dbg(x) if(debug) cerr<<BRIGHT_CYAN<<#x<<COLOR_RESET<<" = "<<(x)<<NORMAL_FAINT<<COLOR_RESET<<endl;
const string COLOR_RESET = "\033[0m", BRIGHT_CYAN = "\033[1;36m", NORMAL_FAINT = "\033[0;2m";
const int N = 1009;
int n, m, dist[N], head[N], flow[N], vis[N], S, T, tot, pre[N];
struct Edge
{
int v, rest, p, nxt;
} edge[N * 40];
typedef long long ll;
int col[N], cnt[N], val[N];
bool SPFA()
{
for (int i = 1; i <= n + m + 10; i++)
dist[i] = flow[i] = 1e16, vis[i] = 0;
queue<int> q;
q.push(S), dist[S] = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; i; i = edge[i].nxt)
{
if (edge[i].rest && dist[edge[i].v] > dist[u] + edge[i].p)
{
dist[edge[i].v] = dist[u] + edge[i].p;
pre[edge[i].v] = i;
flow[edge[i].v] = min(flow[u], edge[i].rest);
if (!vis[edge[i].v])
q.push(edge[i].v), vis[edge[i].v] = 1;
}
}
}
return dist[T] < 1e15;
}
void maxflow()
{
ll ans = 0, f = 0;
//cout << "maxflow" << endl;
while (SPFA())
{
//cout << "SPFA" << endl;
//cout << flow[T] << " " << dist[T] << endl;
f += flow[T];
ans += flow[T] * dist[T];
int x = T;
while (x != S)
{
int y = pre[x];
edge[y].rest -= flow[T];
edge[y ^ 1].rest += flow[T];
x = edge[y ^ 1].v;
}
}
//最大流保证序列合法
if (f < n / 2) cout << "-1\n";
else
{
ans = -ans;
for (int i = 1; i <= n; i++)
ans += val[i];
cout << ans << '\n';
}
}
void add(int u, int v, int c, int w, int t = 1)
{
edge[++tot] = (Edge) {v, c, w, head[u]};
head[u] = tot;
if (t) add(v, u, 0, -w, 0);
}
void solve()
{
//长度为2 * n 有m种颜色
//n个左括号第i种颜色必须有cnt[i]个
cin >> n >> m;
for (int i = 1; i <= m; i++) cin >> cnt[i], cnt[i] = -cnt[i];
n *= 2;
for (int i = 1; i <= n; i++)
{
cin >> col[i];
cnt[col[i]]++;
}
for (int i = 1; i <= n; i++) cin >> val[i];
memset(head, 0, sizeof head);
S = 1, T = 2;
tot = 1;
add(S, n + 2, n / 2, 0);
for (int i = n; i > 1; i--)
{
add(i + 2, i + 1, 1e9, 0);
add(i + 2, n + 2 + col[i], 1, val[i]);
}
add(1 + 2, n + 2 + col[1], 1, val[1]);
bool flag = 1;
for (int i = 1; i <= m; i++)
{
add(n + 2 + i, T, cnt[i], 0);
if (cnt[i] < 0)
{
flag = 0;
}
}
if (flag) maxflow();
else cout << "-1\n";
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3672kb
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: 3644kb
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'