我AC了!!!!
查看原帖
我AC了!!!!
1083490
aliofmireak楼主2024/11/9 15:51

code

#include <cstdio>
 #include <algorithm>
 #include <cstring>
 //#include<bits/stdc++.h>
 inline void read(int &x) {
     x = 0;
     char c = getchar();
     while(c < '0' || c > '9') {
         c = getchar();
     }
     while(c >= '0' && c <= '9') {
         x = (x << 3) + (x << 1) + c - 48;
         c = getchar();
     }
     return;
 }
 
 const int N = 100010;
 const int dx[4] = {0, 1, 0, -1};
 const int dy[4] = {1, 0, -1, 0};
 
 const int MO = 19260817, B = 998244353;
 struct POS {
     int x, y, h;
     POS(int xx = 0, int yy = 0) {
         x = xx;
         y = yy;
         h = (1ll * x * B + y) % MO;
         if(h < 0) {
             h += MO;
         }
     }
     inline bool operator ==(const POS &d) const {
         return x == d.x && y == d.y;
     }
 };
 struct Node {
     int nex, val;
     POS p;
 }node[N * 30]; int top;
 struct MAP {
     int e[MO];
     inline void insert(const POS &d, const int &a) {
         node[++top].val = a;
         node[top].nex = e[d.h];
         node[top].p = d;
         e[d.h] = top;
         return;
     }
     inline int find(const POS &d) { 
         for(int i = e[d.h]; i; i = node[i].nex) {
             if(node[i].p == d) {
                 return node[i].val;
             }
         }
         return 0;
     }
     inline void clear() {
         memset(e, 0, sizeof(e));
         return;
     }
 }mp, use;
 
 int n, m, c, xi[N], yi[N], tot, num, root;
 int dfn[N * 25], low[N * 25], vis[N * 25];
 bool cut[N * 25], vis_c[N], OK;
 
 inline void np(int x, int y) {
     if(!mp.find(POS(x, y)) && !use.find(POS(x, y))) {
         mp.insert(POS(x, y), ++tot);
     }
     return;
 }
 
 inline int get(int x, int y) {
     return mp.find(POS(x, y));
 }
 
 void tarjan(int s, int x, int y) {
     dfn[s] = low[s] = ++num;
     int temp = 0;
     for(int i = 0; i < 4; i++) {
         int t = get(x + dx[i], y + dy[i]);
         if(!t) {
             continue;
         }
         if(!dfn[t]) {
             tarjan(t, x + dx[i], y + dy[i]);
             low[s] = std::min(low[s], low[t]);
             if(low[t] >= dfn[s]) {
                 temp++;
             }
         }
         else {
             low[s] = std::min(low[s], dfn[t]);
         }
     }
     if(temp >= 2 || (temp == 1 && s != root)) {
         cut[s] = 1;
     }
     return;
 }
 
 void DFS_1(int s, int x, int y, int temp) {
     vis[s] = temp;
     for(int i = 0;i < 4; i++) {
         int t = get(x + dx[i], y + dy[i]);
         if(!t) {
             continue;
         }
         if(!vis[t]) {
             DFS_1(t, x + dx[i], y + dy[i], temp);
         }
     }
     return;
 }
 
 bool fd;
 int number;
 
 bool DFS_2(int s, int x, int y) {
     vis_c[s] = 1;
     for(int i = 0; i < 4; i++) {
         if(use.find(POS(x + dx[i], y + dy[i]))) {
             int ed = use.find(POS(x + dx[i], y + dy[i]));
             if(vis_c[ed]) {
                 continue;
             }
             int t = DFS_2(ed, x + dx[i], y + dy[i]);
             if(!t) {
                 return 0;
             }
         }
         else if(get(x + dx[i], y + dy[i])) {
             if(!fd) {
                 number = vis[get(x + dx[i], y + dy[i])];
                 fd = 1;
             }
             else if(number != vis[get(x + dx[i], y + dy[i])]) {
                 OK = 0;
                 return 0;
             }
         }
     }
     return 1;
 }
 
 inline bool check() {
     OK = 1;
     int temp = 0;
     for(int i = 1; i <= c; i++) {
         for(int x = xi[i] - 2; x <= xi[i] + 2; x++) {
             for(int y = yi[i] - 2; y <= yi[i] + 2; y++) {
                 if(vis_c[i]) {
                     continue;
                 }
                 if(mp.find(POS(x, y)) && !vis[get(x, y)]) {
                     ++temp;
                     DFS_1(get(x, y), x, y, temp);
                     goto f1;
                 }
             }
         }
         f1:
         if(!vis_c[i]) {
             fd = 0;
             DFS_2(i, xi[i], yi[i]);
         }
         if(!OK) {
             break;
         }
     }
     return !OK;
 }
 
 inline int solve() {
     read(n);
     read(m);
     read(c);
     if(!c) {
         if(n == 1 && m == 1) {
             return -1;
         }
         if(n == 1 || m == 1) {
             if(n == 2 || m == 2) {
                 return -1;
             }
             return 1;
         }
         return 2;
     }
     for(int i = 1; i <= c; i++) {
         read(xi[i]);
         read(yi[i]);
         use.insert(POS(xi[i], yi[i]), i);
     }
     if(c + 1 >= 1ll * n * m) {
         return -1;
     }
     for(int i = 1; i <= c; i++) {
         for(int x = xi[i] - 2; x <= xi[i] + 2; x++) {
             for(int y = yi[i] - 2; y <= yi[i] + 2; y++) {
                 if(x > 0 && y > 0 && x <= n && y <= m && (x != xi[i] || y != yi[i])) {
                     np(x, y);
                 }
             }
         }
     }
     if(check()) {
         return 0;
     }
     if(c + 2 == 1ll * n * m) {
         return -1;
     }
     if(m == 1 || n == 1) {
         return 1;
     }
     for(int i = 1; i <= c; i++) {
         for(int x = xi[i] - 2; x <= xi[i] + 2; x++) {
             for(int y = yi[i] - 2; y <= yi[i] + 2; y++) {
                 if(!use.find(POS(x, y))) {
                     root = get(x, y);
                     if(dfn[root]) {
                         continue;
                     }
                     tarjan(root, x, y);
                 }
             }
         }
     }
 
     for(int i = 1; i <= c; i++) {
         for(int x = xi[i] - 1; x <= xi[i] + 1; x++) {
             for(int y = yi[i] - 1; y <= yi[i] + 1; y++) {
                 int s = get(x, y);
                 if(cut[s]) {
                     return 1;
                 }
             }
         }
     }
     return 2;
 }
 
 inline void clear() {
     mp.clear();
     use.clear();
     memset(dfn + 1, 0, tot * sizeof(int));
     memset(low + 1, 0, tot * sizeof(int));
     memset(cut + 1, 0, tot * sizeof(bool));
     memset(vis + 1, 0, tot * sizeof(int));
     memset(vis_c + 1, 0, c * sizeof(bool));
     tot = 0;
     num = 0;
     top = 0;
     return;
 }
 signed main() {
     int T;
     read(T);
     while(T--) {
         printf("%d\n", solve());
         if(T) {
             clear();
         }
     }
     return 0;
 }

认真看,可以发现我和题解不一样!!
记录

2024/11/9 15:51
加载中...