QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#574271 | #9315. Rainbow Bracket Sequence | qkm66666 | WA | 1ms | 4124kb | C++17 | 3.3kb | 2024-09-18 21:19:17 | 2024-09-18 21:19:17 |
Judging History
answer
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<cstdio>
#include<cctype>
#include<vector>
#include<bitset>
#include<random>
#include<ctime>
#include<queue>
#include<cmath>
#include<list>
#include<map>
#include<set>
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long,long long>
#define FF fflush(stdout)
#define inf 0x3f3f3f3f
#define endl "\n"
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
inline int read()
{
int s=0,f=1;
char x=getchar();
while(!isdigit(x))f=(x=='-'?-1:1),x=getchar();
while(isdigit(x))s=s*10+x-'0',x=getchar();
return s*f;
}
int s,t;
struct hlydl{
int x,y,c,v,nxt;
void clr()
{
x=y=c=v=nxt=0;
}
}e[100005];
int num=2;
int hd[5005];
void addedge(int x,int y,int c,int v)
{
e[num].x=x;
e[num].y=y;
e[num].c=c;
e[num].v=v;
e[num].nxt=hd[x];
hd[x]=num++;
}
ll dis[5005];
bool in[5005];
int cur[5005];
bool vis[5005];
bool spfa()
{
queue<int> q;
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push(s);
while(!q.empty())
{
int x=q.front();
cur[x]=hd[x];
q.pop();
in[x]=0;
for(int i=hd[x];i;i=e[i].nxt)
{
int to=e[i].y;
if(e[i].c>0&&dis[to]>dis[x]+e[i].v)
{
dis[to]=dis[x]+e[i].v;
if(!in[to])
{
in[to]=1;
q.push(to);
}
}
}
}
return dis[t]!=dis[0];
}
long long mf=0,mc=0;
ll dfs(int x,ll in)
{
if(x==t)return in;
ll ans=0;
vis[x]=1;
for(int i=cur[x];i&∈i=e[i].nxt)
{
cur[x]=i;
int to=e[i].y;
if(vis[to]||dis[to]!=dis[x]+e[i].v||!e[i].c)continue;
ll del=dfs(to,min(in,(ll)e[i].c));
e[i].c-=del;
e[i^1].c+=del;
ans+=del;
mc+=del*e[i].v;
in-=del;
}
return ans;
}
void MCMF()
{
while(spfa())
{
memset(vis,0,sizeof(vis));
mf+=dfs(s,inf);
}
}
int c[105];
int w[205],col[205];
void add(int x,int y,int c,int v)
{
addedge(x,y,c,v);
addedge(y,x,0,-v);
}
#define reaD read
int main()
{
int T=read();
while(T--)
{
num=2;
mc=mf=0;
int n=read(),m=read();
for(int i=1;i<=m;i++)
c[i]=read();
for(int i=1;i<=2*n;i++)
col[i]=reaD();
for(int i=1;i<=2*n;i++)
w[i]=reaD();
s=2*n+m+2+2*n,t=s+1;
int tmp=s-1;
int cnt=0;
ll sum=0;
for(int i=1;i<=2*n;i++)
sum+=w[i];
add(s,tmp,1e9,(int)2e9);
for(int i=1;i<=m;i++)
{
add(s,i,c[i],0);
cnt+=c[i];
}
for(int i=1;i<=2*n;i++)
{
add(col[i],i+m+2*n,1,0);
add(tmp,i+m+2*n,1,0);
add(i+m+2*n,i+m,1,0);
}
for(int i=2;i<=2*n;i++)
add(i+m,i+m-1,1e9,w[i]-w[i-1]);
for(int i=2;i<=2*n;i+=2)
add(i+m,t,1,w[i]);
MCMF();//cout<<mc<<" "<<mf<<endl;
if(mf<cnt||e[3].c!=mf-cnt)puts("-1");
else printf("%lld\n",sum+(mf-cnt)*(ll)2e9-mc);
for(int i=2;i<=num;i++)
e[i].clr();
memset(hd,0,sizeof(hd));
}
return 0;
}
/*
2
3 2
1 1
1 2 2 2 2 1
3 4 1 2 2 1
3 2
1 2
1 2 2 2 1 2
3 1 1 2 40 4
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 4124kb
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: 1ms
memory: 3912kb
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:
-1 343766215 2351080746 3426965219 -1 -1 1351561190 2539318868 1013080942 5372255482 1311169903 -1 -1 2585739197 3983627641 5685927653 -1 1046749330 6115214757 4234093903 -1 3762128853 4221028500 2566553992 5953721306 5977120748 7505501534 -1 4515956757 1467678317 883992368 -1 -1 4024634503 -1 14472...
result:
wrong answer 10th numbers differ - expected: '4656646546', found: '5372255482'