Truy vấn kết nối có hoàn tác

Đề bài

Mô tả

Cho một đồ thị vô hướng có N đỉnh, ban đầu không có cạnh nào. Đỉnh được đánh số từ 1 đến N.

Bạn cần xử lý M thao tác, mỗi thao tác có một trong ba dạng sau:

  • + u v — Thêm một cạnh nối hai đỉnh u và v. Cho phép có nhiều cạnh trùng nhau giữa cùng một cặp đỉnh (multi-edge).
  • - u v — Xoá một cạnh nối u và v. Dữ liệu đảm bảo rằng tại thời điểm thao tác này, có ít nhất một cạnh (u,v) đang tồn tại. Nếu có nhiều cạnh trùng nhau giữa u và v, chỉ một trong số đó bị xoá.
  • ? u v — Truy vấn: hãy in YES nếu u và v đang nằm trong cùng một thành phần liên thông sau tất cả các thao tác đã thực hiện trước đó, ngược lại in NO.

Lưu ý: cạnh là vô hướng, và một đỉnh luôn liên thông với chính nó (truy vấn dạng ? u u luôn trả lời YES).

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên N và M.
  • M dòng tiếp theo, mỗi dòng là một trong ba thao tác được mô tả ở trên: một ký tự (+, - hoặc ?) theo sau là hai số nguyên u, v.

Dữ liệu ra

Với mỗi thao tác ?, in một dòng chứa YES hoặc NO theo thứ tự xuất hiện của truy vấn.

Ràng buộc

  • 1≤N≤105
  • 1≤M≤2·105
  • 1≤u,v≤N
  • Với mọi thao tác - u v, đảm bảo có ít nhất một cạnh (u,v) đang tồn tại tại thời điểm đó.

Ví dụ

Input Output Giải thích
4 7
+ 1 2
+ 2 3
? 1 3
- 2 3
? 1 3
+ 3 4
? 1 4
YES
NO
NO
Sau hai phép thêm đầu tiên, các đỉnh 1-2-3 cùng thành phần nên truy vấn 1 trả lời YES. Sau khi xoá cạnh (2,3), đỉnh 3 tách khỏi {1,2}, nên truy vấn 2 trả lời NO. Cạnh (3,4) chỉ nối 3 với 4 mà không nối lại 3 với 1, nên truy vấn 3 trả lời NO.
3 5
+ 1 2
+ 1 2
- 1 2
? 1 2
? 2 3
YES
NO
Có hai cạnh song song giữa 1 và 2. Xoá một cạnh vẫn còn một cạnh nối 1 với 2, nên truy vấn đầu trả lời YES. Đỉnh 3 cô lập, nên truy vấn sau trả lời NO.

Ghi chú

Bài toán yêu cầu xử lý cả phép thêm và phép xoá cạnh. Cấu trúc Union-Find thông thường không hỗ trợ xoá hiệu quả. Hãy nghĩ cách xử lý offline: đọc trước toàn bộ thao tác, sau đó xử lý chúng theo một thứ tự khéo léo hơn.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0