QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#569276#9315. Rainbow Bracket SequenceAuroraaTL 0ms13772kbC++202.7kb2024-09-16 21:40:532024-09-16 21:40:53

Judging History

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

  • [2024-09-16 21:40:53]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:13772kb
  • [2024-09-16 21:40:53]
  • 提交

answer

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;

#define int long long
const int N=5e5+5,M=1e6+5;
int head[N],cntt=1;
struct Edge{
    int to,next;
    int val,cost;	//val为流,cost为费用
}edge[2*M];
void add(int u,int v,int x,int y){
    edge[++cntt].to=v;
    edge[cntt].val=x;
    edge[cntt].cost=y;
    edge[cntt].next=head[u];
    head[u]=cntt;
}

int all,S,T,fee=0;		//all为节点个数
int dis[N],vis[N],cur[N];
bool spfa(){
    for(int i=0;i<=all;i++){
        dis[i]=INT_MAX;
        vis[i]=0;
    }
    deque<int>q;
    q.push_back(S);
    dis[S]=0,vis[S]=1;
    cur[S]=head[S];
    while(!q.empty()){
        int tmp=q.front();
        q.pop_front();
        vis[tmp]=0;
        for(int i=head[tmp];i;i=edge[i].next){
            int y=edge[i].to;
            if(edge[i].val==0||dis[y]<=(dis[tmp]+edge[i].cost))continue;
            dis[y]=dis[tmp]+edge[i].cost;
            cur[y]=head[y];
            if(!vis[y]){
                if(!q.empty()&&dis[y]<dis[q.front()])q.push_front(y);
                else q.push_back(y);
            }
        }
    }
    return dis[T]!=INT_MAX;
}
int dfs(int x,int flow){
    if(x==T)return flow;
    int rest=flow;
    vis[x]=1;
    for(int i=cur[x];i;i=edge[i].next){
        cur[x]=i;
        int y=edge[i].to;
        int cost=edge[i].cost;
        if((dis[y]==(dis[x]+cost))&&(edge[i].val)&&(!vis[y])){
            int tmp=dfs(y,min(edge[i].val,rest));
            edge[i].val-=tmp;
            edge[i^1].val+=tmp;
            rest-=tmp;
            fee+=tmp*cost;
            if(rest==0)break;
        }
    }
    vis[x]=0;
    return flow-rest;
}
int dinic(){
    int ans=0;
    while(spfa()){
        for(int i=0;i<=all;i++)vis[i]=0;
        ans+=dfs(S,INT_MAX);
    }
    return ans;
}
void add1(int u,int v,int x,int y){add(u,v,x,-y),add(v,u,0,y);}

int c[N],val[N];
void solve(){
    int n,m,s=0;
    cin>>n>>m;
    S=2*n+m+2,T=S+1,all=T,cntt=1,fee=0;
    for(int i=1;i<=m;i++){
        int x;
        cin>>x;
        add1(S,i,x,0);
        s+=x;
    }
    if(s<=n)add1(S,m+1,n-s,0);
    for(int i=1;i<=2*n;i++)cin>>c[i];
    for(int i=1;i<=2*n;i++)cin>>val[i];
    if(s>n){
        cout<<-1<<endl;
        return;
    }
    for(int i=1;i<=2*n;i++){
        add1(m+1,m+1+i,1,val[i]);
        add1(c[i],m+1+i,1,val[i]);
        if(i%2==1)add1(m+1+i,T,1,0);
        if(i>1)add1(m+i,m+1+i,n,0);
    }
    if(dinic()<n)cout<<-1<<endl;
    else cout<<-fee<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int Te=1;
    cin>>Te;
    while(Te--){
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 13772kb

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: