离散化的一个题 终于会了 借鉴了一下大佬的题解(一模一样)
大佬题解链接如下
题解
题目链接
格子染色
有自己的一些理解
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
struct Node
{
int k, l, r;
bool operator < (const Node & W) const
{
if (k != W.k) return k < W.k;
else if (l != W.l) return l < W.l;
else if (r != W.r) return r < W.r;
}
};
int n;
LL cnt;
vector<Node> cols, rows;
void merge(vector<Node> &segs)
{
sort(segs.begin(), segs.end());//开始按照 k 的顺序来排序
vector<Node> res;
int st, ed, k;
st = ed = k = -2e9;
for (auto seg : segs)
{
if (seg.k == k)//如果和前一个是一列或者一排 就可以进行区间合并
{
if (ed < seg.l)//不能合并
{
if(st != -2e9) res.push_back({k, st, ed}), cnt += ed - st + 1;//把前一个放进新的容器里面
st = seg.l, ed = seg.r;//让我这个新的作为下一个比较的前一个 这里的k可以不用更新 因为是一样的
}
else ed = max(ed, seg.r);//可以合并 更新我的右端点 继续比较
}
else
{
if (st != -2e9)//只要不是第一个区间 就得到一个新的区间 因为不在一列或者一行 不能合并
{
cnt += ed - st + 1;
res.push_back({k, st, ed});
}
k = seg.k, st = seg.l, ed = seg.r;//更新迭代 因为k不同 需要更新
}
}
if(st != -2e9) res.push_back({k, st, ed}), cnt += ed - st + 1;
segs = res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
while (n--)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;//离散化区间
if (x1 == x2) cols.push_back({x1, min(y1, y2), max(y1, y2)});
else rows.push_back({y1, min(x1, x2), max(x1, x2)});
}
merge(cols), merge(rows);//对区间进行合并
for(auto col : cols)
for(auto row : rows)//除去最后一个点 横竖相交的
if(row.k >= col.l && row.k <= col.r && row.r >= col.k && row.l <= col.k) cnt --;
cout << cnt << endl;
return 0;
}