Thảo luậnSnackDown Online Qualifier 2017 - Same Snake

5 bài đăng
21.05.2017 / 15:06
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Trong lưới 2D, các ô được xác định bởi (i, j). Bạn đã nhận được thông tin về hình ảnh của hai con rắn trong bản đồ. Bạn muốn kiểm tra xem chúng có thể là hình ảnh của một con rắn hay không.

Mỗi hình con rắn được cho bằng một đoạn thẳng trong lưới mà bạn đã biết điểm đầu và điểm cuối. Giờ hãy xem mỗi ô của lưới là một đỉnh. Có một cạnh giữa hai đỉnh khi và chỉ khi hai đỉnh là hai ô kề nhau trong hình ảnh của ít nhất một con rắn. Tức là, với ít nhất một con rắn, khi bạn đi từ đầu này tới đầu kia, hai ô kề nhau sẽ xuất hiện liên tục.

Hình ảnh hai con rắn có thể gộp làm một nếu thỏa mãn các điều kiện sau đây:

- Tập hợp các ô của con rắn đầu tiên và con rắn thứ hai tạo thành một thành phần liên

thông.

- Không có đỉnh nào có bậc lớn hơn 2 trong đồ thị.

Nói cách khác, kết hợp hai thành phần phải tạo thành một đường đi.

Dữ liệu vào

- Dòng đầu tiên chứa một số nguyên T là số lượng test. Các test được miêu tả như sau

- Dòng đầu tiên của mỗi test chứa bốn số nguyên X11, Y11, X12, Y12 thể hiện hai đầu mút của con rắn đầu tiên là (X11, Y11) và (X12, Y12).

- Dòng thứ hai của mỗi test chứa bốn số nguyên X21, Y21, X22, Y22 thể hiện hai đầu mút của con rắn thứ hai là (X21, Y21) và (X22, Y22).

Dữ liệu ra

- Với mỗi test, in ra “yes” nếu hai con rắn có thể gộp lại như định nghĩa bên trên, và “no”

trong trường hợp ngược lại.

Ràng buộc

- 1 ≤ T ≤ 10^5

- -10^9 ≤ Xij,Yij ≤ 10^9

- Hai đầu mút của rắn được đảm bảo là cùng một dòng hoặc cùng một cột và các con rắn chiếm tất cả những ô ở giữa, kể cả hai đầu mút.

Vı́ dụ

Input:

TEXT
  1. 7 4
  2. 2 1 8 1
  3. 11 1 7 1
  4. 2 1 8 1
  5. 11 1 9 1
  6. 2 1 8 1
  7. 3 1 3 -2
  8. 2 1 8 1
  9. 2 1 2 -2

Output:

TEXT
  1. yes
  2. no
  3. no
  4. yes

Giải thích

Trong các hình, con rắn đầu tiên có màu đỏ, con rắn thứ hai có màu vàng và nếu có đoạn trùng nhau thì chúng có màu cam.

Test đầu tiên tương ứng với

[IMAGE]

Cả hai đầu kiện đều thỏa mãn nên đáp án là “yes”.

Test thứ hai tương ứng với

[IMAGE]

Không có cạnh nào ở giữa hai đỉnh tương ứng với ô (8, 1) và ô (9, 1). Do đó kết hợp lại không

thành đồ thị liên thông nên đáp án là “no”.

Test thứ ba tương ứng với

[IMAGE]

Đỉnh tương ứng với ô (3, 1) có bậc là 3, lớn hơn 2 nên đáp án là “no”

Test thứ tư tương ứng với

[IMAGE]

Thỏa mãn các điều kiện nên đáp án là “yes”

____________

Time Limit: 1 secs

Source Limit: 50000 Bytes

Languages: ADA, ASM, BASH, BF, C, C99 strict, CAML, CLOJ, CLPS, CPP 4.3.2, CPP 4.9.2, CPP14, CS2, D, ERL, FORT, FS, GO, HASK, ICK, ICON, JAVA, JS, LISP clisp, LISP sbcl, LUA, NEM, NICE, NODEJS, PAS fpc, PAS gpc, PERL, PERL6, PHP, PIKE, PRLG, PYPY, PYTH, PYTH 3.4, RUBY, SCALA, SCM chicken, SCM guile, SCM qobi, ST, TCL, TEXT, WSPC

Đã chỉnh sửa. MrKen (21.05.2017 / 22:11)
22.05.2017 / 15:02
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Thiếu điều kiện nào không nhỉ :10:

CPP
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int t, x11, y11, x12, y12, x21, y21, x22, y22;
  5. int main()
  6. {
  7. scanf("%d", &t);
  8. while (t--) // loop for testcases
  9. {
  10. scanf("%d %d %d %d", &x11, &y11, &x12, &y12);
  11. scanf("%d %d %d %d", &x21, &y21, &x22, &y22);
  12. // Same row
  13. if (x11 == x12 && x11 == x21 && x11 == x22) {
  14. if ((y11 <= max(y21, y22) && y11 >= min(y21, y22)) || (y12 <= max(y21, y22) && y12 >= min(y21, y22))) {
  15. cout << "yes\n"; continue;
  16. } else {
  17. cout << "no\n"; continue;
  18. }
  19. }
  20. // Same column
  21. if (y11 == y12 && y11 == y21 && y11 == y22) {
  22. if ((x11 <= max(x21, x22) && x11 >= min(x21, x22)) || (x12 <= max(x21, x22) && x12 >= min(x21, x22))) {
  23. cout << "yes\n"; continue;
  24. } else {
  25. cout << "no\n"; continue;
  26. }
  27. }
  28. // different row or collumn
  29. if (
  30. (x11 == x21 && y11 == y21) ||
  31. (x11 == x22 && y11 == y22) ||
  32. (x12 == x21 && y12 == y21) ||
  33. (x12 == x22 && y12 == y22)
  34. ) {
  35. cout << "yes\n"; continue;
  36. }
  37. cout << "no\n";
  38. }
  39. return 0;
  40. }
Đã chỉnh sửa. MrKen (22.05.2017 / 15:38)
22.05.2017 / 15:13
Cvhungs20
Bài đăng: 55
Member
Vnlove.tk

bài này ez :))

22.05.2017 / 15:38
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

sao vẫn lỗi nhỉ :(

22.05.2017 / 22:45
Cvhungs20
Bài đăng: 55
Member
Vnlove.tk
CPP
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. int t, n;
  5. int a, b, c, d, aa, bb, cc, dd;
  6. bool check1()
  7. {
  8. if(b == d && d == bb && bb == dd && ( (a <= aa && aa <= c) || (aa <= a && a <= cc))) return true;
  9. if(a == aa && a == c && a == cc && ((b <= bb && bb <= d) || (bb <= b && b <= dd))) return true;
  10. if(a == aa && b == bb) return true;
  11. if(a == bb && b == aa) return true;
  12. if(a == cc && b == dd) return true;
  13. if(a == dd && b == cc) return true;
  14. if(c == aa && d == bb) return true;
  15. if(c == bb && d == aa) return true;
  16. if(c == cc && d == dd) return true;
  17. if(c == dd && d == cc) return true;
  18. return false;
  19. }
  20. int main()
  21. {
  22. cin >> t;
  23. while(t--)
  24. {
  25. cin >> a >> b >> c >> d >> aa >> bb >> cc >> dd;
  26. bool ok = false;
  27. if(a == c && b > d) swap(b, d);
  28. if(b == d && a > c) swap(a, c);
  29. if(aa == cc && bb > dd) swap(bb, dd);
  30. if(bb == dd && aa > cc) swap(aa, cc);
  31. //cout << a << " " << b << " " << c << " " << d << " " << aa << " " << bb << " " << cc << " " << dd << "\n";
  32. ok = check1();
  33. if(!ok) cout << "no\n";
  34. else cout << "yes\n";
  35. }
  36. return 0;
  37. }