(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

제출 #810624

#제출 시각아이디문제언어결과실행 시간메모리
810624Theo830Garden (JOI23_garden)C++17
100 / 100
2065 ms9912 KiB
#include <bits/stdc++.h> using namespace std; #define f(i,a,b) for(int i = a;i < b;i++) #define ll int #define ii pair<ll,ll> #define pb push_back #define F first #define S second ll par[5005]; ll l[5005]; ll r[5005]; ll find_par(ll x){ if(par[x] == x){ return x; } return par[x] = find_par(par[x]); } void enose(ll p1,ll p2){ par[p1] = p2; l[p2] = l[p1]; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll n,m,d; cin>>n>>m>>d; ll p[n],q[n]; ll exo[d] = {0}; bool ip[d] = {0}; vector<ll> adj[d]; vector<ll>w; bool ex[d] = {0}; f(i,0,n){ cin>>p[i]>>q[i]; ip[q[i]] = 1; exo[p[i]]++; ex[q[i]] = 1; w.pb(q[i]); } ll R[m],s[m]; f(i,0,m){ cin>>R[i]>>s[i]; adj[s[i]].pb(R[i]); ex[s[i]] = 1; w.pb(s[i]); } f(i,0,d){ sort(adj[i].begin(),adj[i].end()); unique(adj[i].begin(),adj[i].end()); } ll ans = d * d; ll Mini = d; sort(w.begin(),w.end()); unique(w.begin(),w.end()); f(i,0,(ll)w.size()-1){ Mini = min(Mini,d - (w[i+1] - w[i] - 1)); } Mini = min(Mini,w.back() - w[0] + 1); ll posi[d]; f(i,0,d){ posi[i] = adj[i].size() - 1; } ll Par[d]; ll LL[d],RR[d]; f(j,0,d){ par[j] = j; l[j] = j; r[j] = j; } ll nex = 0; f(j,0,d){ nex++; if(nex == d){ nex = 0; } if(!ex[j]){ enose(j,nex); } } f(j,0,d){ Par[j] = par[j]; LL[j]= l[j]; RR[j] = r[j]; } f(i,0,d){ ll siz = 1; ll sum = 0; ll cur = i; vector<ll>del[d]; ll mini = Mini; f(j,0,d){ par[j] = Par[j]; l[j]= LL[j]; r[j] = RR[j]; } f(j,0,d){ if(!ip[j] && !adj[j].empty()){ if(adj[j].back() < i){ posi[j] = adj[j].size() - 1; } else{ ll next = posi[j] + 1; if(next == adj[j].size()){ next = 0; } while(adj[j][next] < i){ posi[j] = next; next = posi[j] + 1; } } del[adj[j][posi[j]]].pb(j); } } while(siz <= d){ sum += exo[cur]; for(auto x:del[cur]){ ll p = find_par(x); ll a = r[p] + 1; if(a >= d){ a -= d; } ll b = l[p] - 1; if(b < 0){ b += d; } a = find_par(a); ll I = r[a]; ll J = r[find_par(b)]; enose(p,a); if(J < I){ mini = min(mini,d - (I - J - 1)); } else{ mini = min(mini,(J - I + 1)); } } if(sum == n){ ans = min(ans,siz * mini); } siz++; if(siz > ans){ break; } cur++; if(cur >= d){ cur -= d; } } } cout<<ans<<"\n"; }

컴파일 시 표준 에러 (stderr) 메시지

garden.cpp: In function 'int main()':
garden.cpp:103:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |                     if(next == adj[j].size()){
      |                        ~~~~~^~~~~~~~~~~~~~~~
#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...