QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#575747#9315. Rainbow Bracket SequenceyldWA 0ms3676kbC++202.6kb2024-09-19 16:35:482024-09-19 16:35:49

Judging History

你现在查看的是最新测评结果

  • [2024-09-19 16:35:49]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3676kb
  • [2024-09-19 16:35:48]
  • 提交

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;
}

Details

Tip: Click on the bar to expand more detailed information

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'