QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#601693 | #9315. Rainbow Bracket Sequence | sjcx | TL | 0ms | 0kb | C++14 | 2.3kb | 2024-09-30 10:58:46 | 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