CF1844E Great Grids 题解
Description
定义一个矩形
- 矩形中每一个元素
都为 其中之一 - 每一个
的子矩形都必须包含三个不同的字符 - 共用一条边的两个元素不相等
给定
,限制 ,限制
求满足所有条件的矩形是否存在。
Solution
先不考虑限制条件,思考一个
不妨设左上角为
观察到左上角+右下角=右上角+左下角,所以
所以每行和每列的差都相等,设
由于相邻的不能相等,所以
然后考虑那个限制条件。
对于限制 1,会发现
对于限制 2,满足
容易发现存在
然后跑二分图染色即可。
时间复杂度:
Code
#include <bits/stdc++.h> // #define int int64_t const int kMaxK = 4e3 + 5; int n, m, k; bool fl; int col[kMaxK], xx[kMaxK], yx[kMaxK], xy[kMaxK], yy[kMaxK]; std::vector<std::pair<int, int>> G[kMaxK]; void dfs(int u) { for (auto [v, w] : G[u]) { if (~col[v] && col[v] != (col[u] ^ w)) { fl = 0; } else if (!~col[v]) { col[v] = col[u] ^ w; dfs(v); } } } void dickdreamer() { std::cin >> n >> m >> k; for (int i = 1; i <= n + m; ++i) { G[i].clear(); col[i] = -1; } for (int i = 1; i <= k; ++i) { std::cin >> xx[i] >> yx[i] >> xy[i] >> yy[i]; if (yy[i] == yx[i] - 1) { G[xx[i]].emplace_back(yy[i] + n, 0); G[yy[i] + n].emplace_back(xx[i], 0); } else { G[xx[i]].emplace_back(yx[i] + n, 1); G[yx[i] + n].emplace_back(xx[i], 1); } } fl = 1; for (int i = 1; i <= n + m; ++i) if (!~col[i]) col[i] = 0, dfs(i); std::cout << (fl ? "YES\n" : "NO\n"); } int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; std::cin >> T; while (T--) dickdreamer(); // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n"; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-10-07 [JOI 2020 Final] オリンピックバス 题解
2022-10-07 [JOI2018] Dango Maker 题解