QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#636308#9412. Stop the Castlelsflsf2023WA 2ms5984kbC++144.1kb2024-10-12 23:18:482024-10-12 23:18:48

Judging History

This is the latest submission verdict.

  • [2024-10-12 23:18:48]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 5984kb
  • [2024-10-12 23:18:48]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;

int x[205], y[205];

int r[205], c[205];

int D1[405], D2[405];

int N1[805], N2[805];

set < int > S1[805], S2[805];

int Flag[805][805];

pair < int , int > A[1000005];

int main()
{
	int T;
	scanf("%d", &T);
	while (T --)
	  {
	    int n;
	    scanf("%d", &n);
	    for (int i = 1 ; i <= n ; ++ i)
	      scanf("%d%d", x + i, y + i);
	    int m;
	    scanf("%d", &m);
	    for (int i = 1 ; i <= m ; ++ i)
	      scanf("%d%d", r + i, c + i);
	    map < int , int > M1, M2;
	    for (int i = 1 ; i <= n ; ++ i)
	      D1[i] = x[i], D2[i] = y[i];
	    for (int i = 1 ; i <= m ; ++ i)
	      D1[i + n] = r[i], D2[i + n] = c[i];
	    sort(D1 + 1, D1 + n + m + 1), sort(D2 + 1, D2 + n + m + 1);
	    int N = 0, M = 0;
	    for (int i = 1 ; i <= 4 * n ; ++ i)
	      N1[i] = N2[i] = 0;
	    for (int i = 1 ; i <= n + m ; ++ i)
	      {
	      	if (M1[D1[i]] == 0)
	      	  if (D1[i] == D1[i - 1] + 1)
	      	    M1[D1[i]] = ++ N, N1[N] = D1[i];
	      	  else
	      	    M1[D1[i]] = N += 2, N1[N - 1] = D1[i] - 1, N1[N] = D1[i];
	      	if (M2[D2[i]] == 0)
	      	  if (D2[i] == D2[i - 1] + 1)
	      	    M2[D2[i]] = ++ M, N2[M] = D2[i];
	      	  else
	      	    M2[D2[i]] = M += 2, N2[M - 1] = D2[i] - 1, N2[M] = D2[i];
		  }
		//cout << N << " " << M << endl;
		for (int i = 1 ; i <= n ; ++ i)
		  x[i] = M1[x[i]], y[i] = M2[y[i]];
		for (int i = 1 ; i <= m ; ++ i)
		  r[i] = M1[r[i]], c[i] = M2[c[i]];
		//for (int i = 1 ; i <= n ; ++ i)
		  //printf("%d %d\n", x[i], y[i]);
		//for (int i = 1 ; i <= m ; ++ i)
		  //printf("%d %d\n", r[i], c[i]);
		for (int i = 1 ; i <= N ; ++ i)
		  S1[i].clear();
		for (int i = 1 ; i <= M ; ++ i)
		  S2[i].clear();
		for (int i = 1 ; i <= N ; ++ i)
		  for (int j = 1 ; j <= M ; ++ j)
		    Flag[i][j] = 0;
		for (int i = 1 ; i <= n ; ++ i)
		  Flag[x[i]][y[i]] = 1, S1[x[i]].insert(y[i]), S2[y[i]].insert(x[i]);
		for (int i = 1 ; i <= m ; ++ i)
		  Flag[r[i]][c[i]] = 2, S1[r[i]].insert(c[i]), S2[c[i]].insert(r[i]);
		bool F = false;
		for (int i = 2 ; i <= N ; ++ i)
		  for (int j = 2 ; j <= M ; ++ j)
		    if (Flag[i][j] == 1 && Flag[i - 1][j] == 1 || Flag[i][j] == 1 && Flag[i][j - 1] == 1)
		      F = true;
		if (F)
		  {
		  	puts("-1");
		  	continue;
		  }
		int Ans = 0;
		for (int i = 1 ; i <= N ; ++ i)
		  for (int j = 1 ; j <= M ; ++ j)
	        if (Flag[i][j] == 0)
		      {
		      	//if (N1[i] == 0 || N2[j] == 0)
		      	  //continue;
		      	int R = 0;
		      	set < int > :: iterator k = S1[i].upper_bound(j);
		      	if (k == S1[i].end() || k == S1[i].begin())
		      	  continue;
		      	int Y2 = *k, Y1 = *(-- k);
		      	if (Flag[i][Y1] == 1 && Flag[i][Y2] == 1)
		      	  ++ R;
		      	k = S2[j].upper_bound(i);
		      	if (k == S2[j].end() || k == S2[j].begin())
		      	  continue;
		      	int X2 = *k, X1 = *(-- k);
		        if (Flag[X1][j] == 1 && Flag[X2][j] == 1)
		          ++ R;
		        if (R == 2)
		          Flag[i][j] = 2, S1[i].insert(j), S2[j].insert(i), A[++ Ans] = make_pair(N1[i], N2[j]);
			  }
		for (int i = 1 ; i <= N ; ++ i)
		  for (int j = 1 ; j <= M ; ++ j)
		    if (Flag[i][j] == 0)
		      {
		      	//if (N1[i] == 0 || N2[j] == 0)
		      	  //continue;
		      	int R = 0;
		      	set < int > :: iterator k = S1[i].upper_bound(j);
		      	if ( !(k == S1[i].end() || k == S1[i].begin() ) )
		      	  {
					
		      	int Y2 = *k, Y1 = *(-- k);
		      	if (Flag[i][Y1] == 1 && Flag[i][Y2] == 1)
		      	  ++ R;
		        if (R)
		          {
		            Flag[i][j] = 2, A[++ Ans] = make_pair(N1[i], N2[j]);
		            continue;
		          }
		      }
		      	k = S2[j].upper_bound(i);
		      	if (k == S2[j].end() || k == S2[j].begin())
		      	  continue;
		      	int X2 = *k, X1 = *(-- k);
		        if (Flag[X1][j] == 1 && Flag[X2][j] == 1)
		          ++ R;
		        if (R)
		          Flag[i][j] = 2, S1[i].insert(j), S2[j].insert(i), A[++ Ans] = make_pair(N1[i], N2[j]);
			  }
		printf("%d\n", Ans);
		for (int i = 1 ; i <= Ans ; ++ i)
		  printf("%d %d\n", A[i].first, A[i].second);
	  }
	return 0;
}

詳細信息

Test #1:

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

input:

4
7
1 3
6 6
4 7
2 1
6 3
4 1
2 6
3
3 4
6 4
3 1
2
1 1
2 2
0
3
1 1
1 3
3 3
1
1 2
3
1 1
1 3
2 3
0

output:

2
2 3
4 6
0
1
2 3
-1

result:

ok ok 4 cases (4 test cases)

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 5952kb

input:

21
11
3 5
18 6
19 12
27 48
28 38
30 12
33 18
42 18
43 38
45 46
48 34
3
2 6
24 4
41 45
15
11 6
15 27
16 9
16 14
16 48
19 26
25 12
27 26
28 4
31 40
32 6
33 50
37 50
46 11
50 29
17
1 49
4 9
9 15
9 22
11 31
11 46
14 28
17 5
17 49
18 43
20 31
30 46
33 11
33 33
34 15
36 6
47 10
2
16 46
36 30
11
7 34
7 41
...

output:

3
23 12
29 38
40 18
26
13 6
16 10
16 11
16 12
16 13
16 15
16 21
16 22
16 25
16 26
16 27
16 28
16 29
16 30
16 31
16 32
16 33
16 39
16 40
16 42
16 43
16 45
16 46
16 47
20 26
34 50
0
1
16 10
0
7
43 22
43 23
43 25
43 26
43 29
43 30
43 35
44
1 3
1 8
1 9
1 11
1 16
1 17
1 18
1 19
1 20
1 21
1 22
1 25
1 26
1...

result:

wrong answer Participant's answer is 26, but jury has better answer 5 (test case 2)