QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#673703#9315. Rainbow Bracket SequenceHHCYTL 0ms0kbC++203.3kb2024-10-25 09:11:302024-10-25 09:11:30

Judging History

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

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

answer

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define i64 int64_t
using namespace std;
struct MCFGraph{
    struct E{
        int v,c,f;
        E(int v,int c,int f):v(v),c(c),f(f){}
    };
    int n;
    vector<E> e;
    vector<vector<int>> g;
    vector<i64> h,dis;
    vector<int> pre;
    int S,T;//
    vector<int> M;//
    const int INF=300*50*2;//
    bool dijstra(int s,int t){
        dis.assign(n+1,numeric_limits<i64>::max());
        pre.assign(n+1,-1);
        priority_queue<pair<i64,int>,vector<pair<i64,int>>,greater<pair<i64,int>>> que;
        dis[s]=0;
        que.emplace(0,s);
        while(!que.empty()){
            i64 d=que.top().first;
            int u=que.top().second;
            que.pop();
            if(dis[u]<d)continue;
            for(int i:g[u]){
                int v=e[i].v,c=e[i].c,f=e[i].f;
                if(c>0&&dis[v]>d+h[u]-h[v]+f){
                    dis[v]=d+h[u]-h[v]+f;
                    pre[v]=i;
                    que.emplace(dis[v],v);
                }
            }
        }
        return dis[t]!=numeric_limits<i64>::max();
    }
    void init(int n){//
        this->n=n+2,S=n+1,T=n+2;
        g.resize(n+3);M.assign(n+1,0);
    }
    //(附加)S=n+1,T=n+2,即初始化不用算附加源汇点
    i64 limCost=0;//
    void addEdge(int u,int v,int l,int r,int f){//
        limCost+=(i64)l*f;
        if(l<r)add(u,v,r-l,f);
        M[u]-=l,M[v]+=l;
    }
    void add(int u,int v,int c,int f){
        g[u].push_back(e.size());
        e.emplace_back(v,c,f);
        g[v].push_back(e.size());
        e.emplace_back(u,0,-f);
    }
    pair<bool,i64> flowST(int s,int t){//
        for(int i=1;i<=n-2;++i)
        if(M[i]>0)add(S,i,M[i],0);
        else if(M[i]<0)add(i,T,-M[i],0);
        add(t,s,INF,0);//无源汇则不需要这行,函数里也不用参数s,t
        i64 res=flow(S,T).second;
        res+=limCost;
        return make_pair(feasibility(),res);
    }
    bool feasibility(){
        for(auto i:g[S])if(e[i].c)return false;
        return true;
    }
    pair<int,i64> flow(int s,int t){
        int flow=0;
        i64 cost=0;
        h.assign(n+1,0);
        while(dijstra(s,t)){
            for(int i=1;i<=n;++i)h[i]+=dis[i];
            int aug=numeric_limits<int>::max();
            for(int i=t;i!=s;i=e[pre[i]^1].v)aug=min(aug,e[pre[i]].c);
            for(int i=t;i!=s;i=e[pre[i]^1].v){
                e[pre[i]].c-=aug;
                e[pre[i]^1].c+=aug;
            }
            flow+=aug;
            cost+=i64(aug)*h[t];
        }
        return make_pair(flow,cost);
    }
}mcf;
int c[205],v[205];
int main()
{
    int T;scanf("%d",&T);
    while(T--)
{
    int n,m;scanf("%d%d",&n,&m);
    int s=n*2+m+1,t=n*2;
    mcf.init(s);
    for(int i=1;i<=m;++i){
        int l;scanf("%d",&l);
        mcf.addEdge(s,n*2+i,l,n,0);
    }
    for(int i=1;i<=n*2;++i)scanf("%d",&c[i]);
    for(int i=1;i<=n*2;++i)scanf("%d",&v[i]);
    for(int i=1;i<n*2;++i){
        mcf.addEdge(n*2+c[i],i,0,1,-v[i]);
        mcf.addEdge(i,i+1,(i+1)/2,n,0);
    }
    pair<bool,i64> ans=mcf.flowST(s,t);
    if(!ans.first)printf("-1\n");
    else printf("%lld\n",-ans.second);
}
    return 0;
}
/*
前2i-1个必有i个
s->Ci(li,n,0)
Ci->Li(0,1,vi)
2i-1->2i (i,n,0)
2i->2i+1(0,n,0)
s=2n+1,t=2n
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Time Limit Exceeded

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:


result: