QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#575747 | #9315. Rainbow Bracket Sequence | yld | WA | 0ms | 3676kb | C++20 | 2.6kb | 2024-09-19 16:35:48 | 2024-09-19 16:35:49 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int MAXN=1e3+5,inf=1e18;
struct edge{
int v,w,id,c;
};
vector<edge>e[MAXN];
int cur[MAXN],dis[MAXN],vis[MAXN],col[MAXN],cnt[MAXN],val[MAXN];
int n,m,S,T,tot;
int ans_flow,ans_cost;
void clear()
{
for(int i=0;i<=tot;i++) e[i].clear();
}
void add(int u,int v,int w,int c)
{
int ui=e[u].size(),vi=e[v].size();
e[u].push_back({v,w,vi,c});
e[v].push_back({u,0,ui,-c});
}
bool bfs()
{
for(int i=0;i<=tot;i++) cur[i]=vis[i]=0,dis[i]=inf;
queue<int> q;
dis[S]=0,vis[S]=1;
q.push(S);
while(q.size())
{
int u=q.front();q.pop();
vis[u]=0;
for(auto [v,w,id,c]:e[u])
{
if(!w || dis[v]<=dis[u]+c) continue;
dis[v]=dis[u]+c;
if(!vis[v]) {vis[v]=1;q.push(v);}
}
}
return dis[T]!=inf;
}
int dfs(int u,int limit)
{
if(u==T) return limit;
vis[u]=1;
for(int i=cur[u];i<e[u].size();i++)
{
cur[u]=i;
int v=e[u][i].v,w=e[u][i].w,c=e[u][i].c;
if(vis[v] || !w || dis[v]!=dis[u]+c) continue;
int t=dfs(v,min(w,limit));
if(t)
{
e[u][i].w-=t;
e[v][e[u][i].id].w+=t;
ans_cost+=t*c;
return t;
}else vis[v]=1;
}
return 0;
}
void dinic()
{
int flow;
while(bfs()) while(flow=dfs(S,inf)) ans_flow+=flow;
}
void solve()
{
cin>>n>>m;
n*=2;
tot=n+m+2;
clear();
for(int i=1;i<=m;i++) cin>>cnt[i],cnt[i]=-cnt[i];
for(int i=1;i<=n;i++)
{
cin>>col[i];
cnt[col[i]]++;
}
for(int i=1;i<=n;i++) cin>>val[i];
S=1,T=2;
add(S,n+2,inf,0);
for(int i=n;i>1;i--)
{
add(i+2,i+1,inf,0);
add(i+2,n+2+col[i],1,val[i]);
}
add(1+2,n+2+col[1],1,val[1]);
int flag=1;
for(int i=1;i<=m;i++)
{
add(n+2+i,T,cnt[i],0);
if(cnt[i]<0) flag=0;
}
// for(int i=1;i<=tot;i++)
// {
// cout<<i<<endl;
// for(auto [v,w,id,c]:e[i]) cout<<v<<' ';
// cout<<endl;
// }
if(!flag) cout<<-1<<endl;
else
{
ans_flow=ans_cost=0;
dinic();
// cout<<ans_flow<<endl;
if(ans_flow<n/2) cout<<-1<<endl;
else
{
ans_cost=-ans_cost;
for(int i=1;i<=n;i++) ans_cost+=val[i];
cout<<ans_cost<<endl;
}
}
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
int t=1;
cin>>t;
while(t--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3556kb
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: 3676kb
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 1649648670 1965446811 2201471991 -1 831452391 2596974815 1093935906 1386497961 545706543 3658675327 2231197660 758225925 0 3231024589 -1 989266948 5808498116 1345740508 -1 1988904333 3028024811 999388067 5751395565 0 1375278074 -1 4236865447 0 883992368 839769227 -1 3899922281 -...
result:
wrong answer 1st numbers differ - expected: '-1', found: '5220751523'