QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#597988#9424. Stop the Castle 2ucup-team1004#WA 61ms17420kbC++142.5kb2024-09-28 19:51:472024-09-28 19:51:52

Judging History

This is the latest submission verdict.

  • [2024-09-28 19:51:52]
  • Judged
  • Verdict: WA
  • Time: 61ms
  • Memory: 17420kb
  • [2024-09-28 19:51:47]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct edge{
	int next,to,f;
}e[N<<3];
int first[N],len,cur[N],vis[N],p[N];
void add(int a,int b,int c)
{
	e[++len]=edge{first[a],b,c};
	first[a]=len;
}
struct my_queue{
	int head,tail,q[N];
	void push(int x){q[tail++]=x;}
	int size(){return tail-head;}
	int top(){return q[head++];}
	void clr()
	{
		for(int i=0,x;i<=tail;i++)
			x=q[i],cur[x]=vis[x]=0;
		head=tail=0;
	}
}q;
int X,Y,n,m,k,p1[N],p2[N],v1[N],v2[N],id[N];
map<int,int> t1,t2;
bool bfs(int x)
{
	q.clr(),cur[x]=first[x];
	q.push(x),vis[x]=1;
	while(q.size())
		for(int i=first[x=q.top()],y;i;i=e[i].next)
			if(e[i].f&&!vis[y=e[i].to])
			{
				vis[y]=vis[x]+1,q.push(y),cur[y]=first[y];
				if(y==Y) return 1;
			}
	return 0;
}
int dfs(int x,int flow)
{
	if(x==Y) return flow;
	int s=0,h;
	for(int &i=cur[x],y;i;i=e[i].next)
	{
		if(e[i].f&&vis[y=e[i].to]==vis[x]+1)
			h=dfs(y,min(e[i].f,flow)),e[i].f-=h,e[i^1].f+=h,s+=h,flow-=h;
		if(!flow) break;
	}
	return s;
}
void Add(int a,int b,int c){add(a,b,c),add(b,a,0);}
struct node{
	int x,y,p;
}a[N];
bool operator <(node a,node b)
{
	return a.x==b.x?a.y<b.y:a.x<b.x;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		vector<int> v;
		scanf("%d%d%d",&n,&m,&k);
		k=m-k,len=1;
		for(int i=1;i<=n;i++)
			scanf("%d%d",&a[i].x,&a[i].y),a[i].p=0;
		for(int i=n+1;i<=n+m;i++)
			scanf("%d%d",&a[i].x,&a[i].y),a[i].p=i-n;
		sort(a+1,a+n+m+1);
		int num=0,S=0;
		for(int i=1,cnt=0;i<=n+m;i++)
		{
			int x=a[i].x,y=a[i].y;
			if(a[i].p==0)
			{
				p1[t1[x]]=p2[t2[y]]=1;
				t1[x]=t2[y]=++cnt;
			}
			else
			{
				x=t1[x],y=t2[y];
				v1[x]=v2[y]=a[i].p;
				if(x&&y) Add(x,y+n,1),id[++num]=a[i].p;
			}
		}
		X=2*n+1,Y=2*n+2;
		for(int i=1;i<=n;i++)
		{
			if(p1[i]) Add(X,i,1),S++;
			if(p2[i]) Add(i+n,Y,1),S++;
		}
		while(bfs(X)) dfs(X,n);
		for(int i=1;k&&i<=num;i++)
		{
			int w=i<<1;
			if(!e[w].f)
				p2[e[w].to-n]=p1[e[w^1].to]=0,p[id[i]]=1,k--,S-=2;
		}
		for(int i=1;i<=n;i++)
		{
			if(k&&p1[i]&&v1[i])
				S--,k--,p[v1[i]]=1;
			if(k&&p2[i]&&v2[i])
				S--,k--,p[v2[i]]=1;
		}
		for(int i=1;k&&i<=n;i++)
			if(!p[i]) p[i]=1,k--;
		printf("%d\n",S);
		for(int i=1;i<=m;i++)
			if(!p[i]) printf("%d ",i);
		puts("");
		for(int i=1;i<=max(n,m);i++) v1[i]=v2[i]=p[i]=id[i]=p1[i]=p2[i]=0;
		t1.clear(),t2.clear();
		for(int i=1;i<=Y;i++) vis[i]=cur[i]=first[i]=0;
		for(int i=1;i<=len;i++) e[i]=e[0];
	}
}

详细

Test #1:

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

input:

3
8 6 4
1 3
2 1
2 6
4 1
4 7
6 1
6 3
6 6
2 3
3 1
4 3
4 6
5 2
6 4
3 2 1
10 12
10 10
10 11
1 4
1 5
1 3 2
1 1
2 1
2 2
2 3

output:

4
2 3 5 6 
2
2 
0
2 3 

result:

ok ok 3 cases (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 61ms
memory: 17420kb

input:

1224
11 17 14
7 3
4 2
8 13
3 15
3 4
5 11
10 2
3 3
8 6
7 11
2 3
10 4
1 3
12 1
2 5
11 9
11 6
11 10
8 15
1 5
9 14
4 11
1 6
10 7
7 6
11 4
8 4
1 11
18 3 2
14 8
2 14
13 13
9 12
14 12
5 6
8 1
10 5
8 6
8 9
6 6
7 5
12 11
6 11
13 5
1 10
7 6
14 5
6 15
2 4
11 1
1 6 4
14 14
13 9
9 3
10 12
7 5
8 13
9 14
1 9 8
4 9...

output:

7
3 4 5 6 7 8 9 10 11 12 13 15 16 17 
15
2 3 
0
2 3 4 5 6 
0
2 3 4 5 6 7 8 9 
11
1 3 
8
1 2 3 
0
1 2 3 4 5 6 7 8 9 10 11 12 
1
5 6 7 9 10 11 12 
8
15 16 17 18 19 
1
1 2 3 4 5 6 7 8 
7
6 8 
10
13 14 15 
1
10 11 12 13 14 15 16 17 18 19 20 
0
1 
1
2 3 
0
4 5 6 7 
7
8 12 13 14 15 
2
10 11 12 13 14 
4
3 ...

result:

wrong answer Integer parameter [name=part] equals to 6, violates the range [0, 1] (test case 4)