Submission #198838

#TimeUsernameProblemLanguageResultExecution timeMemory
198838brcodeDrzava (COCI15_drzava)C++14
128 / 160
731 ms65540 KiB
#include <iostream> #include <iomanip> #include <bits/stdc++.h> using namespace std; const long long MAXN = 1e5+5; const long double eps = 0.00001; bool visited[MAXN]; long long test; long long 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<long long,cmpf> s1; vector<long long> v1[MAXN]; vector<long long> 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))<=x*x; } void dfs(long long curr){ tempv.push_back(curr); visited[curr] = true; for(long long x:v1[curr]){ if(!visited[x]){ dfs(x); } } } bool findsubset(){ long long m = tempv.size(); m--; if(m>k){ return true; } for(long long i=0;i<=m+1;i++){ for(long long j=0;j<=k+1;j++){ dp[i][j] = false; } } for(long long mod = 0;mod<k;mod++){ dp[m+1][mod] = !mod; } for(long long i=m;i>=1;i--){ for(long long mod = 0;mod<k;mod++){ dp[i][mod] = dp[i+1][mod]; if(dp[i+1][(mod+p[tempv[i]].second)%k]){ dp[i][mod] = true; } } if(dp[i+1][p[tempv[i]].second]){ return true; } } return false; } bool check(long double x){ for(long long i=1;i<=n;i++){ v1[i].clear(); visited[i] = false; } s1.clear(); long long j = 1; for(long long i=1;i<=n;i++){ if(test){ //cout<<p[i].first.first-p[j].first.first<<endl; } while((long double)(p[i].first.first-p[j].first.first)>x){ s1.erase(j); j++; } if(!s1.empty()){ long long cnt = 0; p[n+1] = make_pair(make_pair(p[i].first.first,p[i].first.second-x),0); for(auto it = s1.lower_bound(n+1);it!=s1.end();it++){ long long idx = *it; if(test && i==6){ //it--; //idx = *it; //cout<<i+1<<" "<<j<<" "<<p[i].first.second-x<<" "<<p[idx].first.first<<" "<<p[i].first.first<<" "<<p[i].first.second<<" "<<p[idx].first.second<<endl; } 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(long long i=1;i<=n;i++){ if(!visited[i]){ tempv.clear(); tempv.push_back(-1); dfs(i); if(test == 23){ // cout<<i<<" "<<tempv.size()-1<<endl; if(i==5){ test = 25; } } if(findsubset()){ return true; } } } return false; } int main() { cin>>n>>k; for(long long 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 = 1e9; 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; } } test=23; // cout<<check(11163410)<<endl; if(ans == -1){ cout<<"No solution"<<endl; }else{ cout<<std::fixed<<setprecision(3)<<ans<<endl; } }
#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...