QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#572682 | #9315. Rainbow Bracket Sequence | 7islands | WA | 1ms | 3656kb | C++14 | 2.9kb | 2024-09-18 15:55:25 | 2024-09-18 15:55:25 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=0x3f3f3f3f;
const ll infll=0x3f3f3f3f3f3f3f3f;
//#define int long long
#define pii pair <int,int>
#define ld long double
#define endl "\n"
const int N=2050,M=2050;
int l[N];
int col[N];
int val[N];
const int INF = 0x3f3f3f3f;
int tot = 1, lnk[N], cur[N], ter[M], nxt[M], cap[M], cost[M], dis[N], ret;
bool vis[N];
void adda(int u, int v, int w, int c) {
ter[++tot] = v, nxt[tot] = lnk[u], lnk[u] = tot, cap[tot] = w, cost[tot] = c;
}
void ADD(int u, int v, int w, int c) { adda(u, v, w, c), adda(v, u, 0, -c); }
bool spfa(int s, int t) {
memset(dis, 0x3f, sizeof(dis));
memcpy(cur, lnk, sizeof(lnk));
std::queue<int> q;
q.push(s), dis[s] = 0, vis[s] = 1;
while (!q.empty()) {
int u = q.front();
q.pop(), vis[u] = 0;
for (int i = lnk[u]; i; i = nxt[i]) {
int v = ter[i];
if (cap[i] && dis[v] > dis[u] + cost[i]) {
dis[v] = dis[u] + cost[i];
if (!vis[v]) q.push(v), vis[v] = 1;
}
}
}
return dis[t] != INF;
}
int dfs(int u, int t, int flow) {
if (u == t) return flow;
vis[u] = 1;
int ans = 0;
for (int &i = cur[u]; i && ans < flow; i = nxt[i]) {
int v = ter[i];
if (!vis[v] && cap[i] && dis[v] == dis[u] + cost[i]) {
int x = dfs(v, t, min(cap[i], flow - ans));
if (x) ret += x * cost[i], cap[i] -= x, cap[i ^ 1] += x, ans += x;
}
}
vis[u] = 0;
return ans;
}
int mcmf(int s, int t) {
int ans = 0;
//cerr<<"touch"<<endl;
while (spfa(s, t)) {
// cerr<<ans<<endl;
int x;
while ((x = dfs(s, t, INF))) ans += x;
}
return ans;
}
signed main (){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin >>t;
while (t--){
int n,m;
cin >>n>>m;
for (int i=0;i<=1949;i++){
lnk[i]=0;
}
tot=1;
ret=0;
for (int i=1;i<=m;i++){
cin >>l[i];
l[i]=-l[i];
}
for (int i=1;i<=2*n;i++){
cin >>col[i];
l[col[i]]++;
}
int sum=0;
for (int i=1;i<=2*n;i++){
cin >>val[i];
sum+=val[i];
}
int flag=1;
for (int i=1;i<=m;i++){
if (l[i]<0)flag=0;
}
int S_=1050,T_=1051;
ADD(S_,n*2,n,0);
for (int i=2;i<=n*2;i++){
ADD(i,i-1,(i-1)/2,0);
}
for (int i=1;i<=n*2;i++){
ADD(i,n*2+col[i],1,val[i]);
}
for (int i=1;i<=m;i++){
ADD(i+n*2,T_,l[i],0);
}
if (!flag){
cout <<-1<<endl;
continue;
}else{
// cout <<mcmf(S_,T_)<<endl;
if (mcmf(S_,T_)==n)cout <<sum-ret<<endl;
else cout <<-1<<endl;
}
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3656kb
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: 3656kb
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 -1943886550 -868002077 -1 -1 1351561190 -1755648428 1013080942 -1 -1 -1 -2063769636 -1575835568 -311339655 417206872 -1 1046749330 1820247461 -373979093 -1 -392878350 -1 -1728413304 -1 1682153452 -1084433058 -1 759308175 1467678317 883992368 1044562986 -1 -270332793 -1 1447294256 -18323...
result:
wrong answer 3rd numbers differ - expected: '2351080746', found: '-1943886550'