ThegeekKnight16

City Park

Apr 22nd, 2023
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. vector<int> pai, sub;
  5.  
  6. int find(int v) {return ((v == pai[v]) ? (v) : pai[v] = find(pai[v]));}
  7. void une(int a, int b)
  8. {
  9.     a = find(a); b = find(b);
  10.     if (a == b) return;
  11.     if (sub[a] < sub[b]) swap(a, b);
  12.     pai[b] = a;
  13.     sub[a] += sub[b];
  14. }
  15.  
  16. int32_t main()
  17. {
  18.     ios_base::sync_with_stdio(false);
  19.     cin.tie(NULL);
  20.     int N;
  21.     cin >> N;
  22.     pai.resize(N+1); sub.resize(N+1);
  23.     iota(pai.begin(), pai.end(), 0);
  24.     for (auto &x : sub) x = 1;
  25.     vector<tuple<int, int, int> > Eventos;
  26.     vector<tuple<int, int, int, int> > v(N+1);
  27.     // cerr << "PENIS" << '\n';
  28.     for (int i = 1; i <= N; i++)
  29.     {
  30.         auto &[X, Y, W, H] = v[i];
  31.         cin >> X >> Y >> W >> H;
  32.         Eventos.emplace_back(X, 0, i);
  33.         Eventos.emplace_back(X+W, 1, i);
  34.     }
  35.  
  36.     // cerr << "PENIS" << '\n';
  37.     sort(Eventos.begin(), Eventos.end());
  38.     set<pair<int, int> > s;
  39.     // cerr << "PENIS" << '\n';
  40.  
  41.     for (auto [X1, type, id] : Eventos)
  42.     {
  43.         auto [X, Y, W, H] = v[id];
  44.         // cerr << X1 << " " << type << " " << id << " " << X << " " << Y << " " << W << " " << H << '\n';
  45.         if (type == 1)
  46.         {
  47.             for (int i = Y; i <= Y+H-1; i++) s.erase(make_pair(i, id));
  48.         }
  49.         else
  50.         {
  51.             auto up = s.lower_bound(make_pair(Y, 0));
  52.             while (up != s.end() && up->first <= (Y+H) && up->first >= (Y-1))
  53.             {
  54.                 une(id, up->second);
  55.                 if (Y <= up->first && up->first <= Y+H-1) up = s.erase(up);
  56.                 else ++up;
  57.             }
  58.             auto low = s.upper_bound(make_pair(Y+H, 0));
  59.             while (low != s.begin() && !s.empty() && (--low)->first >= (Y-1) && low->first <= (Y+H))
  60.             {
  61.                 une(id, low->second);
  62.                 if (Y <= low->first && low->first <= Y+H-1) low = s.erase(low);
  63.             }
  64.             for (int i = Y; i <= Y+H-1; i++) s.emplace(i, id);
  65.         }
  66.  
  67.         // cerr << "s: " << '\n';
  68.         // cerr << X1 << ": ";
  69.         // if (s.empty()) cerr << "-";
  70.         // for (auto [y, id] : s) cerr << y << " ";
  71.         // cerr << '\n';
  72.     }
  73.  
  74.     // for (int i = 1; i <= N; i++) cerr << (i-1) << " " << (find(i)-1) << '\n';
  75.     // cerr << '\n';
  76.  
  77.     // cerr << "PENIS" << '\n';
  78.     vector<int> resp(N+1);
  79.     for (int i = 1; i <= N; i++) resp[find(i)] += (get<2>(v[i])*get<3>(v[i]));
  80.     // cerr << "PENIS" << '\n';
  81.  
  82.     int ans = 0;
  83.     for (int i = 1; i <= N; i++) ans = max(ans, resp[i]);
  84.     cout << ans << '\n';
  85. }
  86.  
  87.  
Add Comment
Please, Sign In to add comment