Submission #199033

#TimeUsernameProblemLanguageResultExecution timeMemory
199033brcodeDrzava (COCI15_drzava)C++14
160 / 160
979 ms53216 KiB
#include <iostream> #include <iomanip> #include <bits/stdc++.h> using namespace std; const int MAXN = 5e4+5; const long double eps = 0.000001; bool visited[MAXN]; //long long test; int n,k; pair<pair<long long,long long>,long long> p[MAXN]; struct cmpf{ inline bool operator()(const long long& i, const long long& j)const{ if(p[i].first.second!=p[j].first.second){ return p[i].first.second<p[j].first.second; } return i>j; } }; set<int,cmpf> s1; vector<int> v1[MAXN]; vector<int> tempv; bool dp[MAXN][40]; bool dist(long long i,long long j,long double x){ return (long double)((p[i].first.first-p[j].first.first)*(p[i].first.first-p[j].first.first))+((p[i].first.second-p[j].first.second)*(p[i].first.second-p[j].first.second))<=(long double)x*x; } void dfs(int curr){ tempv.push_back(curr); visited[curr] = true; for(int x:v1[curr]){ if(!visited[x]){ dfs(x); } } } int checkmod(int x){ if(x<k){ return x; } return x-k; } bool findsubset(){ int m = tempv.size(); m--; if(m>k){ return true; } for(int i=0;i<=m+1;i++){ for(int j=0;j<=k+1;j++){ dp[i][j] = false; } } for(int mod = 0;mod<k;mod++){ dp[m+1][mod] = !mod; } for(int i=m;i>=1;i--){ for(int mod = 0;mod<k;mod++){ dp[i][mod] = dp[i+1][mod]; if(dp[i+1][(checkmod(mod+p[tempv[i]].second))]){ dp[i][mod] = true; } } if(dp[i+1][p[tempv[i]].second]){ return true; } } return false; } bool check(long double x){ for(int i=1;i<=n;i++){ v1[i].clear(); visited[i] = false; } s1.clear(); int j = 1; for(int i=1;i<=n;i++){ while((long double)(p[i].first.first-p[j].first.first)>x){ s1.erase(j); j++; } if(!s1.empty()){ int cnt = 0; p[n+1] = make_pair(make_pair(p[i].first.first,(long long)(p[i].first.second-(long long)x)),0); for(auto it = s1.lower_bound(n+1);it!=s1.end();it++){ int idx = *it; if(p[idx].first.second>p[i].first.second+x){ break; } cnt++; if(cnt>=8*k){ return true; } if(dist(i,idx,x)){ v1[i].push_back(idx); v1[idx].push_back(i); } } } s1.insert(i); } for(int i=1;i<=n;i++){ if(!visited[i]){ tempv.clear(); tempv.push_back(-1); dfs(i); if(findsubset()){ return true; } } } return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>p[i].first.first>>p[i].first.second>>p[i].second; p[i].second%=k; } sort(p+1,p+n+1); long double l = 0; long double r = 1e8; long double ans = -1; while(r-l>eps){ long double mid = (l+r)/2; if(check(mid)){ ans = mid; r = mid-eps; }else{ l = mid+eps; } } // cout<<check(11163410)<<endl; if(ans == -1){ printf("No solution!\n"); }else{ printf("%.3lf",(double)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...
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...