main.cc 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. const int N = 50000;
  5. struct UF {
  6. int id[3 * N + 1];
  7. int sz[3 * N + 1];
  8. };
  9. UF uf;
  10. int find(int i) {
  11. if (i == uf.id[i]) return i;
  12. int j = find(uf.id[i]);
  13. uf.id[i] = j;
  14. return j;
  15. }
  16. bool is_join(int i, int j) { return find(i) == find(j); }
  17. void join(int i, int j) {
  18. i = find(i);
  19. j = find(j);
  20. if (i == j) return;
  21. if (uf.sz[i] < uf.sz[j]) {
  22. uf.id[i] = j;
  23. } else {
  24. if (uf.sz[i] == uf.sz[j]) uf.sz[i]++;
  25. uf.id[j] = i;
  26. }
  27. }
  28. int main() {
  29. int n, k, d, x, y;
  30. scanf("%d %d", &n, &k);
  31. memset(uf.sz, 0, sizeof(uf.sz));
  32. for (int i = 1; i <= n; i++) {
  33. uf.id[i] = i;
  34. uf.id[i + N] = i + N;
  35. uf.id[i + 2 * N] = i + 2 * N;
  36. }
  37. int ans = 0;
  38. for (int i = 0; i < k; i++) {
  39. scanf("%d %d %d", &d, &x, &y);
  40. if (x < 1 || n < x || y < 1 || n < y) {
  41. ans++;
  42. continue;
  43. }
  44. if (d == 1) {
  45. if (is_join(x, y + N) || is_join(x, y + 2 * N)) {
  46. ans++;
  47. continue;
  48. }
  49. join(x, y);
  50. join(x + N, y + N);
  51. join(x + 2 * N, y + 2 * N);
  52. } else {
  53. if (is_join(x, y) || is_join(x, y + 2 * N)) {
  54. ans++;
  55. continue;
  56. }
  57. join(x, y + N);
  58. join(x + N, y + 2 * N);
  59. join(x + 2 * N, y);
  60. }
  61. }
  62. printf("%d\n", ans);
  63. return 0;
  64. }