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; } };