QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#569301 | #9315. Rainbow Bracket Sequence | Auroraa | WA | 0ms | 15912kb | C++20 | 2.8kb | 2024-09-16 21:51:55 | 2024-09-16 21:51:56 |
Judging History
answer
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
#define int long long
const int N=5e5+5,M=1e6+5;
const int INF=1e15;
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]=INF;
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]<INF;
}
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,INF);
}
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];
int n,m,s=0;
int pos1(int x){
return m+1+x;
}
int pos2(int x){
return m+1+n+x;
}
void solve(){
cin>>n>>m;
S=4*n+m+2,T=S+1,all=T,cntt=1,fee=0,s=0;
for(int i=1;i<=all;i++)head[i]=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(pos1(i), pos2(i),1,0);
add1(m+1, pos1(i),1,val[i]);
add1(c[i],pos1(i),1,val[i]);
if(i%2==1)add1(pos2(i),T,1,0);
if(i>1)add1(pos2(i-1),pos2(i),INF,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: 15912kb
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
Wrong Answer
time: 0ms
memory: 15848kb
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:
5220751523 374461155 2502973832 3887118329 2201471991 -1 1662904782 2539318868 1093935906 5130819811 -1 4600692243 2231197660 3262645341 4640037833 5713023532 -1 1831202593 6590110372 4247389899 -1 4484157486 5172951913 3221957709 5751395565 6100572497 7674184299 -1 5092636851 1467678317 883992368 1...
result:
wrong answer 1st numbers differ - expected: '-1', found: '5220751523'