QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#575863 | #9315. Rainbow Bracket Sequence | yld | WA | 0ms | 3608kb | C++20 | 2.7kb | 2024-09-19 17:05:23 | 2024-09-19 17:05:23 |
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<=m;i++) cout<<cnt[i]<<' ';
// cout<<endl;
for(int i=1;i<=n;i++) cin>>val[i];
S=1,T=2;
add(S,n+2,n/2,0);
for(int i=n;i>1;i--)
{
add(i+2,i+1,(i-1)/2,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: 0
Wrong Answer
time: 0ms
memory: 3608kb
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:
3 9 2 -1
result:
wrong answer 1st numbers differ - expected: '9', found: '3'