数据求加强

P2601 [ZJOI2009] 对称的正方形

要加强数据请自己提供 hack 数据。
by yurzhang @ 2021-08-04 16:59:54


```cpp #include<iostream> using namespace std; const int N = 1003; int n, m, square[N][N]; class Pos { public: int x, y; Pos() {} Pos(int a, int b) :x(a), y(b) {} friend Pos operator+(Pos a, Pos b) { return Pos(a.x + b.x, a.y + b.y); } friend Pos operator-(Pos a, Pos b) { return Pos(a.x - b.x, a.y - b.y); } friend Pos operator*(Pos a, int b) { return Pos(a.x * b, a.y * b); } friend Pos operator/(Pos a, int b) { return Pos(a.x / b, a.y / b); } friend istream& operator>>(istream& in, Pos& a) { in >> a.x >> a.y; return in; } }; bool leg(Pos a, int sz) { if (sz & 1) { sz >>= 1; if (a.x + sz >= n || a.x - sz < 0) return 0; if (a.y + sz >= m || a.y - sz < 0) return 0; return 1; } else { sz >>= 1; if (a.x + sz >= n || a.x - sz < -1) return 0; if (a.y + sz >= m || a.y - sz < -1) return 0; return 1; } } int count(Pos a) { bool flag = 1; int ans = 0; for (int i = 2; flag; i += 2) {//当前正方形不可扩展后或者越界break,最坏枚举n次 if (!leg(a, i)) break; for (int j = 0; j < (i >> 1); ++j) {//暴力扩展正方形边界,最坏枚举n次 Pos af = a + Pos{ -(i >> 1) + 1, -j }, aj = a + Pos{ i >> 1,-j }, ak = a + Pos{ -(i >> 1) + 1,j + 1 }, al = a + Pos{ i >> 1,j + 1 }; bool f = square[af.x][af.y] == square[aj.x][aj.y] && square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y]; if (!f) { flag = 0; break; } af = a + Pos{ -j , -(i >> 1) + 1 }, aj = a + Pos{ -j ,i >> 1 }, ak = a + Pos{ j + 1 , -(i >> 1) + 1 }, al = a + Pos{ j + 1, i >> 1 }; f = square[af.x][af.y] == square[aj.x][aj.y] && square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y]; if (!f) { flag = 0; break; } } if (flag) ++ans; } flag = 1; for (int i = 3; flag; i += 2) { if (!leg(a, i)) break; for (int j = 0; j <= (i >> 1); ++j) { Pos af = a + Pos{ -(i >> 1), -j }, aj = a + Pos{ i >> 1,-j }, ak = a + Pos{ -(i >> 1),j }, al = a + Pos{ i >> 1,j }; bool f = square[af.x][af.y] == square[aj.x][aj.y] && square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y]; if (!f) { flag = 0; break; } af = a + Pos{ -j , -(i >> 1) }, aj = a + Pos{ -j ,i >> 1 }, ak = a + Pos{ j , -(i >> 1) }, al = a + Pos{ j, i >> 1 }; f = square[af.x][af.y] == square[aj.x][aj.y] && square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y]; if (!f) { flag = 0; break; } } if (flag) ++ans; } return ans; } int main() { ios::sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> square[i][j]; } } int ans = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) {//两层循环平方 ans += count(Pos{ i,j });//count复杂度最坏情况平方 } } cout << ans + n * m; } ``` 如注释
by donkeys @ 2021-08-04 17:12:05


只需要 ``` 1000 1000 1 1 repeat 998times 1 1 repeat 998times repeat 998times ``` 就能卡掉
by donkeys @ 2021-08-04 17:14:20


@[donkeys](/user/237893) 您的 hack 数据已添加进本题,感谢您的贡献~
by yurzhang @ 2021-08-04 17:56:29


请求管理撤下[这篇题解](https://cloudy-sky.blog.luogu.org/solution-2601)@[yurzhang](/user/126486)
by _CloudySky_ @ 2021-08-05 10:28:03


刚发就被 Hack 了…
by _CloudySky_ @ 2021-08-05 10:29:02


@[_CloudySky_](/user/304572) 已经撤下。 其实昨天我就测了您的题解,而且您的题解好像还是我打回去好几遍之后通过的(
by yurzhang @ 2021-08-05 11:17:41


感谢管理员 话说打回理由好像并没有说我的复杂度不对:( 而且题解还是审严格一点号好 @[yurzhang](/user/126486)
by _CloudySky_ @ 2021-08-05 11:35:56


@[_CloudySky_](/user/304572) 因为我们鼓励不同解法的题解,所以某些复杂度可能没有那么正确,但足够新颖有趣的题解也是可以通过的。
by yurzhang @ 2021-08-05 11:39:57


|