Submission #817922

#TimeUsernameProblemLanguageResultExecution timeMemory
817922beaconmcGarden (JOI23_garden)C++14
45 / 100
1199 ms28300 KiB
    #include <bits/stdc++.h>
    //#include <ext/pb_ds/assoc_container.hpp>
    //#include <ext/pb_ds/tree_policy.hpp>
     
     
     
    typedef long long ll;
    using namespace std;
    //using namespace __gnu_pbds;
     
    #define FOR(i, x, y) for(ll i=x; i<y; i++)
    #define FORNEG(i, x, y) for(ll i=x; i>y; i--)
    //#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>
    #define fast() ios_base::sync_with_stdio(false);cin.tie(NULL)
     
     
    ll n,m,d;
     
    ll cc[5001];
    ll sz[5001];
    ll mx = 0;
     
    ll find(ll a){
      while (cc[a]!=a) cc[a]=cc[cc[a]],a=cc[a];
      return a;
    }
     
    void unite(ll a,ll b){
      ll A = find(a), B = find(b);
      if (A==B) return;
      sz[B] += sz[A];
      cc[A] = B;
      mx = max(mx, sz[B]);
    }
     
    void insert(ll a){
      sz[a] = max(sz[a], (ll) 1);
      mx = max(mx, (ll) 1);
     
     
      if (sz[(a-1+d)%d]) unite((a-1+d)%d, a);
      if (sz[(a+1+d)%d]) unite((a+1+d)%d, a);
    }
     
     
     
    int main(){
        FOR(i,0,5001) cc[i] = i, sz[i]=0;
     
        fast();
        
        cin >> n >> m >> d;
        vector<vector<ll>> a,b;
     
        FOR(i,0,n){
          vector<ll> temp(2);
          cin >> temp[0] >> temp[1];
          a.push_back(temp);
        }
     
        FOR(i,0,m){
          vector<ll> temp(2);
          cin >> temp[0] >> temp[1];
          b.push_back(temp);
        }
     
        vector<ll> X[10001];
        bool Y[5001];
     
        FOR(i,0,m){
          X[b[i][0]].push_back(b[i][1]);
          X[b[i][0]+d].push_back(b[i][1]);
        }
        FOR(i,0,n){
          X[a[i][0]] = {-1};
          X[a[i][0]+d] = {-1};
          Y[a[i][1]] = 1;
        }
     
     
        ll ans = 1000000000000000;
     
     
     
     
        FORNEG(p, d*2-1,-1){
          bool stuff[5001];
          FOR(i,0,5001) stuff[i]=0;
     
          FOR(i,0,5001) cc[i] = i, sz[i]=0;
          mx = 0;
     
          ll r = -1;
          FOR(i,p+1,d*2){
            if (X[i].size() && X[i][0]==-1){
              r = i;
              break;
            }else if (X[i].size()){
              vector<ll> temp;
              for (auto&j : X[i]){
                if (stuff[j] == 0){
                  temp.push_back(j);
                  stuff[j]=1;
                }
              }
              X[i] = temp;
            }
          }
     

          FOR(i,0,d){
            if (!stuff[i] && !Y[i]){
              insert(i);
            }
          }
     
     
     
          FORNEG(i, r, p){
            
     
            if (X[i].size() and X[i][0] != -1){
              for (auto&j : X[i]){
                if (!Y[i]) insert(j);
              }
            }
            ans = min(ans, (d-mx) * (d-(i-p-1)));
          }
     
        }
        cout << ans;
     
     
        
     
     
     
     
     
    }
     
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...