QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#590793#9315. Rainbow Bracket SequencewxgmjfhyTL 0ms3896kbC++202.6kb2024-09-26 11:30:432024-09-26 11:30:43

Judging History

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

  • [2024-09-26 11:30:43]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3896kb
  • [2024-09-26 11:30:43]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f

const int N=400,M=1000;

int h[N],e[M<<1],ne[M<<1],c[M<<1],w[M<<1],idx=2;
int sum[N];

inline void add(int a,int b,int down,int up,int W){
    sum[a]-=down,sum[b]+=down;
    e[idx]=b,ne[idx]=h[a],c[idx]=up-down,w[idx]=W,h[a]=idx++;
    swap(a,b),up=down=0,W=-W;
    e[idx]=b,ne[idx]=h[a],c[idx]=up-down,w[idx]=W,h[a]=idx++;
}

int n,m;
int S,T,P;

int cur[N],vis[N];
ll d[N];

inline bool spfa(){
    for(int i=0;i<=P;i++)d[i]=-inf;

    deque<int>q;
    q.push_back(S),d[S]=0,vis[S]=1;
    while(q.size()){
        int u=q.front();
        q.pop_front();
        vis[u]=0;
        for(int i=h[u];i;i=ne[i]){
            int t=e[i];
            if(c[i]&&d[t]<d[u]+w[i]){
                d[t]=d[u]+w[i];
                if(!vis[t]){
                    vis[t]=1;
                    q.empty()||d[t]>d[q.front()]?
                    q.push_front(t):q.push_back(t);
                }
            }
        }
    }
    
    return d[T]!=-inf;
}

inline int dfs(int u,int mf){
    if(u==T)return mf;
    vis[u]=1;

    int sum=0;
    for(int i=cur[u];i;i=ne[i]){
        cur[u]=i;
        int t=e[i];
        if(!vis[t]&&c[i]&&d[t]==d[u]+w[i]){
            int f=dfs(t,min(mf,c[i]));
            sum+=f,mf-=f;
            c[i]-=f,c[i^1]+=f;
            if(!mf)break;
        }
    }

    if(!sum)d[u]=-inf;

    vis[u]=0;
    return sum;
}

inline pair<ll,ll> Dinic(){
    ll flow=0,cost=0;
    while(spfa()){
        memcpy(cur,h,sizeof h);
        int f=dfs(S,1e9);
        flow+=f;
        cost+=f*d[T];
    }
    return {flow,cost};
}

inline void init(){
    P=m+n*n+3;

    idx=2;
    for(int i=0;i<=P;i++)h[i]=sum[i]=0;
}

inline void solve(){
    cin>>n>>m;
    
    init();

    int s=0,t=m+n+n+1;

    for(int i=1,l;i<=m;i++){
        cin>>l;
        add(s,i,l,1e9,0);
    }

    vector<int>col(n+n+1),val(n+n+1);
    for(int i=1;i<=n+n;i++)cin>>col[i];
    for(int i=1;i<=n+n;i++)cin>>val[i];
    for(int i=1;i<=n+n;i++)add(col[i],i+m,0,1,val[i]);

    for(int i=1;i<=n+n;i++){
        if(i==n+n)add(i+m,t,n,n,0);
        else add(i+m,i+1+m,(i+1)/2,min(i,n),0);
    }

    S=m+n+n+2,T=m+n+n+3;

    int full=0;
    for(int i=s;i<=t;i++){
        if(sum[i]>0)add(S,i,0,sum[i],0),full+=sum[i];
        if(sum[i]<0)add(i,T,sum[i],0,0);
    }

    add(t,s,0,1e9,0);

    auto [flow,cost]=Dinic();

    cout<<(flow==full?cost:-1)<<"\n";
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(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: 3896kb

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
Time Limit Exceeded

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:


result: