#include <iostream>
#include <iomanip>
#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 5e4+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;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
6 ms |
1528 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
6 ms |
1528 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
24 ms |
3064 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
15 ms |
1912 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
25 ms |
2296 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1532 KB |
Output is correct |
2 |
Correct |
25 ms |
2808 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
1528 KB |
Output is correct |
2 |
Correct |
24 ms |
3112 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
17 ms |
2424 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
192 ms |
9560 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Runtime error |
370 ms |
65540 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Runtime error |
355 ms |
65540 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
677 ms |
40792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
728 ms |
42260 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Runtime error |
353 ms |
65540 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1532 KB |
Output is correct |
2 |
Correct |
530 ms |
13944 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
611 ms |
23028 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
624 ms |
42600 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1532 KB |
Output is correct |
2 |
Correct |
644 ms |
43736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1528 KB |
Output is correct |
2 |
Correct |
500 ms |
16756 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
1528 KB |
Output is correct |
2 |
Correct |
520 ms |
15736 KB |
Output is correct |