二维坐标离散化模板
struct Two_D_Discrete { int n, tot1 = 1, tot2 = 1; vector<vector<int>> mp; vector<int> x, y, nx, ny; vector<pair<i64, i64>> a; vector<PII> New; Two_D_Discrete (int _n, vector<pair<i64, i64>>& _a): n(_n), a(_a) { x.resize(n), y.resize(n); nx.resize(n * 2 + 5), ny.resize(n * 2 + 5); vector<vector<int>>(n * 2 + 5, vector<int>(n * 2 + 5)).swap(mp); for (int i = 0; i < n; i ++) { x[i] = a[i].first; y[i] = a[i].second; } } void work() { //排序 sort(x.begin(), x.end()); sort(y.begin(), y.end()); // 去重 并得到有多少个点 int len1 = unique(x.begin(), x.end()) - x.begin(); int len2 = unique(y.begin(), y.end()) - y.begin(); // 离散化 x 轴 for (int i = 0; i < len1; i++) { if (i && x[i] != x[i - 1] + 1) nx[tot1++] = x[i] - 1, nx[tot1++] = x[i]; else nx[tot1++] = x[i]; } // 离散化 y 轴 for (int i = 0; i < len2; i++) { if (i && y[i] != y[i - 1] + 1) ny[tot2++] = y[i] - 1, ny[tot2++] = y[i]; else ny[tot2++] = y[i]; } //映射关系将需离散的点放入离散图中 for (int i = 0; i < n; i++) { int newx = lower_bound(nx.begin(), nx.begin() + tot1, a[i].first) - nx.begin(); int newy = lower_bound(ny.begin(), ny.begin() + tot2, a[i].second) - ny.begin(); mp[newx][newy] = 1; // cout << "(" << newx << ',' << newy << ")\n"; New.emplace_back(newx, newy); } } };
本文作者:Ke_scholar
本文链接:https://www.cnblogs.com/Kescholar/p/18059849
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步