1,[(1,2),(2,3)]
2
最坏情况下两个人都被感染
1,[(1,2),(3,4)]
1
最坏情况下只有一个人被感染
人的编号从0开始第个人的活动范围为[Pos[i].x,Pos[i].y];
<
#include <numeric>
class DSU {
public:
DSU(int n) : p_(n), sizes_(n, 1) {
iota(begin(p_), end(p_), 0);
}
int Find(int x) {
if (p_[x] == x) return x;
return p_[x] = Find(p_[x]);
}
void Union(const int u, const int v) {
const int pu = Find(u);
const int pv = Find(v);
if (pu == pv) return;
p_[pu] = pv;
sizes_[pv] += sizes_[pu];
}
int size(int x) {
return sizes_[Find(x)];
}
private:
vector<int> p_;
vector<int> sizes_;
};
class Solution {
public:
int CatchVirus(int Personid, vector<Point>& PeoplePosition) {
const int n = PeoplePosition.size();
DSU dsu(n);
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
if (intersect(PeoplePosition[i], PeoplePosition[j]))
dsu.Union(i, j);
return dsu.size(Personid);
}
private:
// 判断两个intervals是否有交集
bool intersect(const Point& a, const Point& b) {
if (a.x < b.x) return b.x <= a.y;
return a.x <= b.y;
}
};