QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#571918#9315. Rainbow Bracket SequencezhouhuanyiWA 0ms3756kbC++232.5kb2024-09-18 10:19:472024-09-18 10:19:48

Judging History

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

  • [2024-09-18 10:19:48]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3756kb
  • [2024-09-18 10:19:47]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<queue>
#define N 1000
#define M 200000
using namespace std;
const int inf=(int)(1.5e9);
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
struct node
{
	int v,data,cost,nxt;
};
node edge[M+1];
struct reads
{
	int num,data;
	bool operator < (const reads &t)const
	{
		return data>t.data;
	}
};
int T,n,m,s,t,len=1,cnt[N+1],l[N+1],c[N+1],v[N+1],head[N+1],cur[N+1],dis[N+1];
bool used[N+1],vis[N+1];
long long delta[N+1];
void add(int x,int y,int z,int w)
{
	edge[++len]=(node){y,z,w,head[x]},head[x]=len;
	edge[++len]=(node){x,0,-w,head[y]},head[y]=len;
	return;
}
bool dijkstra()
{
	int top;
	priority_queue<reads>q;
	for (int i=s;i<=t;++i) dis[i]=inf,used[i]=0;
	dis[s]=0,q.push((reads){s,0});
	while (!q.empty())
	{
		top=q.top().num,q.pop();
		if (used[top]) continue;
		used[top]=1;
		for (int i=head[top];i>0;i=edge[i].nxt)
			if (edge[i].data&&dis[edge[i].v]>dis[top]+delta[top]-delta[edge[i].v]+edge[i].cost)
				dis[edge[i].v]=dis[top]+delta[top]-delta[edge[i].v]+edge[i].cost,q.push((reads){edge[i].v,dis[edge[i].v]});
	}
	for (int i=s;i<=t;++i) delta[i]+=dis[i];
	return used[t];
}
int dinic(int x,int flow)
{
	if (x==t) return flow;
	int d;
	vis[x]=1;
	for (int &i=cur[x];i>0;i=edge[i].nxt)
		if (edge[i].data&&!vis[edge[i].v]&&delta[edge[i].v]==delta[x]+edge[i].cost)
		{
			d=dinic(edge[i].v,min(flow,edge[i].data));
			if (d)
			{
				edge[i].data-=d,edge[i^1].data+=d,vis[x]=0;
				return d;
			}
		}
	vis[x]=0;
	return 0;
}
int main()
{
	int flow,rst;
	long long res;
	bool op;
	T=read();
	while (T--)
	{
		n=read(),m=read(),s=rst=res=0,t=(n<<1)+m+1,len=op=1;
		for (int i=s;i<=t;++i) head[i]=delta[i]=0;
		for (int i=1;i<=m;++i) l[i]=read(),cnt[i]=0;
		for (int i=1;i<=(n<<1);++i) c[i]=read(),cnt[c[i]]++;
		for (int i=1;i<=(n<<1);++i) v[i]=read(),res+=v[i];
		for (int i=1;i<=m;++i)
			if (cnt[i]<l[i])
				op=0;
		if (!op)
		{
			puts("-1");
			continue;
		}
		for (int i=1;i<=n;++i) add(s,i<<1,1,0);
		for (int i=1;i<=(n<<1)-1;++i) add(i,i+1,1,0);
		for (int i=1;i<=(n<<1);++i) add(i,(n<<1)+c[i],1,v[i]);
		for (int i=1;i<=m;++i) add((n<<1)+i,t,cnt[i]-l[i],0);
		while (dijkstra())
		{
			for (int i=s;i<=t;++i) cur[i]=head[i];
			while (flow=dinic(s,inf)) rst+=flow,res-=flow*delta[t];
		}
		if (rst!=n) puts("-1");
		else printf("%lld\n",res);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3748kb

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: 3756kb

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
3388626525
-1
-1
1351561190
2539318868
1013080942
4656646546
-1
-1
2231197660
2719131728
3983627641
4674921047
-1
1046749330
6094528633
3920988203
-1
3902088946
-1
2566553992
5068750082
5977120748
6961475169
-1
5054275471
1467678317
883992368
1044562986
-1
4024634503
-1
14472...

result:

wrong answer 4th numbers differ - expected: '3426965219', found: '3388626525'