QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#590798 | #9315. Rainbow Bracket Sequence | wxgmjfhy | TL | 0ms | 3596kb | C++20 | 2.7kb | 2024-09-26 11:33:41 | 2024-09-26 11:33:41 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
const int N=1000,M=10000;
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";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t=1;
cin>>t;
while(t--)solve();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3596kb
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...