Submission #47731

#TimeUsernameProblemLanguageResultExecution timeMemory
47731IvanCDrzava (COCI15_drzava)C++17
160 / 160
182 ms19296 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> ii; typedef tuple<int,int,int> trinca; const int MAXN = 50010; const int MAXK = 32; int pai[MAXN],possivel[MAXN][MAXK],X[MAXN],Y[MAXN],Z[MAXN],N,K; vector<trinca> ordenado; int find(int x){ if(x == pai[x]) return x; return pai[x] = find(pai[x]); } void join(int x,int y){ x = find(x); y = find(y); if(x == y) return; if(x > y) swap(x,y); int novo[MAXK]; for(int i = 0;i<K;i++) novo[i] = possivel[x][i] | possivel[y][i]; for(int i = 0;i<K;i++){ for(int j = 0;j<K;j++){ novo[(i+j) % K] |= (possivel[x][i] & possivel[y][j]); } } for(int i = 0;i<K;i++) possivel[x][i] |= novo[i]; pai[y] = x; } inline ll dist(int a,int b){ return 1LL*(X[a] - X[b])*(X[a] - X[b]) + 1LL*(Y[a] - Y[b])*(Y[a] - Y[b]); } int checa(ll maximo){ int teto = (int)ceil(sqrt(maximo)) + 3; for(int i = 1;i<=N;i++){ pai[i] = i; for(int j = 0;j<K;j++){ possivel[i][j] = 0; } possivel[i][Z[i]] = 1; } set<ii> caixa; int ponteiro = 1; caixa.insert(ii(Y[1],1)); for(int i = 2;i<=N;i++){ while(X[i] - X[ponteiro] > teto){ caixa.erase(ii(Y[ponteiro],ponteiro)); ponteiro++; } for(set<ii>::iterator it = caixa.lower_bound(ii(Y[i] - teto,-1));it != caixa.end();it++){ int j = (*it).second; if(abs(Y[j] - Y[i]) > teto) break; if(dist(i,j) <= maximo) join(i,j); if(possivel[find(i)][0]) return 1; } if(possivel[find(i)][0]) return 1; caixa.insert(ii(Y[i],i)); } return 0; } int main(){ scanf("%d %d",&N,&K); for(int i = 0;i<N;i++){ int x,y,z; scanf("%d %d %d",&x,&y,&z); ordenado.push_back(make_tuple(x,y,z)); } sort(ordenado.begin(),ordenado.end()); for(int i = 1;i<=N;i++){ X[i] = get<0>(ordenado[i-1]); Y[i] = get<1>(ordenado[i-1]); Z[i] = get<2>(ordenado[i-1]) % K; } ll ini = 0, fim = 2*1e18,meio,ans = 2*1e18; while(ini <= fim){ meio = ini + (fim - ini)/2; if(checa(meio)){ ans = meio; fim = meio - 1; } else{ ini = meio + 1; } } printf("%.3lf\n",sqrt(ans)); return 0; }

Compilation message (stderr)

drzava.cpp: In function 'int main()':
drzava.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&N,&K);
     ~~~~~^~~~~~~~~~~~~~~
drzava.cpp:69:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d",&x,&y,&z);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...