QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#601693#9315. Rainbow Bracket SequencesjcxTL 0ms0kbC++142.3kb2024-09-30 10:58:462024-09-30 10:58:46

Judging History

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

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

answer

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
#define re int
#define ll long long
inline ll read(){
    ll x=0,ff=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')ff=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^'0');c=getchar();}
    return x*ff;
}
const int inf=1<<30;
int t,n,m,lim[105],c[205],v[205],h[350],S,T,s[105];
int nt[1000],ut[1000],vl[1000],to[1000],tot;
inline void add(int x,int y,int z,int zz){
	nt[++tot]=h[x];h[x]=tot;to[tot]=y;ut[tot]=z;vl[tot]=zz;
	nt[++tot]=h[y];h[y]=tot;to[tot]=x;ut[tot]=0;vl[tot]=-zz;
}
ll ans,ss,dis[350];
int dl[10000],lt,rt;
bool b[350],awa[350];
ll spfa(){
	for(re i=S;i<=T;i++)dis[i]=1e18;
	dis[S]=0;dl[lt=rt=1]=S;int u;
	while(lt<=rt){
		u=dl[lt++];b[u]=0;
		for(re j=h[u];j;j=nt[j]){
			if(ut[j]&&dis[to[j]]>dis[u]+vl[j]){
				dis[to[j]]=dis[u]+vl[j];
				if(!b[to[j]]){
					b[to[j]]=1;dl[++rt]=to[j];
				}
			}
		}
	}
	if(dis[T]==1e18)return -1;
	return dis[T];
}
int dfs(int i,int fl){
	if(i==T||!fl)return fl;
	int u=0,qwq;awa[i]=1;
	for(re j=h[i];j;j=nt[j]){
		if(!ut[j]||dis[to[j]]!=dis[i]+vl[j]||awa[to[j]])continue;
		qwq=dfs(to[j],min(fl-u,ut[j]));
		if(!qwq){dis[to[j]]=1e18;continue;}
		ut[j]-=qwq;ut[j^1]+=qwq;
		u+=qwq;if(fl==u){awa[i]=0;return fl;}
	}awa[i]=0;
	return u;
}
int main(){
	freopen("tt.in","r",stdin);
    t=read();while(t--){
    	n=read();m=read();tot=1;ans=0;
    	for(re i=1;i<=m;i++)lim[i]=read(),s[i]=0;
    	for(re i=1;i<=(n<<1);i++)c[i]=read(),s[c[i]]++;
    	for(re i=1;i<=(n<<1);i++)v[i]=read(),ans+=v[i];
    	bool ok=0;for(re i=1;i<=m;i++)if(s[i]<lim[i]){ok=1;break;}
    	if(ok){puts("-1");continue;}
    	S=0;T=n*2+m+1;add(S,(n<<1),n,0);
    	for(re i=1;i<(n<<1);i++)add(i+1,i,i>>1,0);
    	for(re i=1;i<=(n<<1);i++)add(i,(n<<1)+c[i],1,v[i]);
    	for(re i=1;i<=m;i++)add((n<<1)+i,T,s[i]-lim[i],0);
    	while(233){
    		ss=spfa();if(ss==-1)break;
    		int ovo=dfs(S,inf);
    		ans-=ss*ovo;
    	}
    	if(!ut[2])printf("%lld\n",ans);
    	else puts("-1");
    	memset(h,0,sizeof(h));
    }
    return 0;
}

/*
f(i++,i++) 
1 0

f(++i,++i)
2 2

f(i++,++i,(i++)+(i++))
3 4 2

f(i++,++i,(++i)+(++i))
3 4 8
*/
/*
 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
 */

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: