QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#571643 | #9315. Rainbow Bracket Sequence | buerjiang | WA | 1ms | 3880kb | C++20 | 2.9kb | 2024-09-18 02:00:58 | 2024-09-18 02:00:59 |
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(){
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];
//cout << "finish" << endl;
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;
}
//__builtin_popcountll()
// cout<<fixed<<setprecision(2);
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3880kb
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: 3632kb
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'