JZOJ 5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven
首先由一个显然的二分之后并查集维护连通性,然后判断上下边界是否处于同一集合的优秀会被卡TLE的做法大概和noip2017的D2T1没啥区别所以这是压到了noip原题吗
正解:https://blog.csdn.net/cold_chair/article/details/78345850
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize(3) 3 %:pragma GCC optimize("Ofast") 4 %:pragma GCC optimize("inline") 5 %:pragma GCC optimize("-fgcse") 6 %:pragma GCC optimize("-fgcse-lm") 7 %:pragma GCC optimize("-fipa-sra") 8 %:pragma GCC optimize("-ftree-pre") 9 %:pragma GCC optimize("-ftree-vrp") 10 %:pragma GCC optimize("-fpeephole2") 11 %:pragma GCC optimize("-ffast-math") 12 %:pragma GCC optimize("-fsched-spec") 13 %:pragma GCC optimize("unroll-loops") 14 %:pragma GCC optimize("-falign-jumps") 15 %:pragma GCC optimize("-falign-loops") 16 %:pragma GCC optimize("-falign-labels") 17 %:pragma GCC optimize("-fdevirtualize") 18 %:pragma GCC optimize("-fcaller-saves") 19 %:pragma GCC optimize("-fcrossjumping") 20 %:pragma GCC optimize("-fthread-jumps") 21 %:pragma GCC optimize("-funroll-loops") 22 %:pragma GCC optimize("-fwhole-program") 23 %:pragma GCC optimize("-freorder-blocks") 24 %:pragma GCC optimize("-fschedule-insns") 25 %:pragma GCC optimize("inline-functions") 26 %:pragma GCC optimize("-ftree-tail-merge") 27 %:pragma GCC optimize("-fschedule-insns2") 28 %:pragma GCC optimize("-fstrict-aliasing") 29 %:pragma GCC optimize("-fstrict-overflow") 30 %:pragma GCC optimize("-falign-functions") 31 %:pragma GCC optimize("-fcse-skip-blocks") 32 %:pragma GCC optimize("-fcse-follow-jumps") 33 %:pragma GCC optimize("-fsched-interblock") 34 %:pragma GCC optimize("-fpartial-inlining") 35 %:pragma GCC optimize("no-stack-protector") 36 %:pragma GCC optimize("-freorder-functions") 37 %:pragma GCC optimize("-findirect-inlining") 38 %:pragma GCC optimize("-fhoist-adjacent-loads") 39 %:pragma GCC optimize("-frerun-cse-after-loop") 40 %:pragma GCC optimize("inline-small-functions") 41 %:pragma GCC optimize("-finline-small-functions") 42 %:pragma GCC optimize("-ftree-switch-conversion") 43 %:pragma GCC optimize("-foptimize-sibling-calls") 44 %:pragma GCC optimize("-fexpensive-optimizations") 45 %:pragma GCC optimize("-funsafe-loop-optimizations") 46 %:pragma GCC optimize("inline-functions-called-once") 47 %:pragma GCC optimize("-fdelete-null-pointer-checks") 48 #include <bits/stdc++.h> 49 using namespace std; 50 const int N = 6010; 51 const double eps = 1e-6; 52 int n, m, k; 53 struct P { int x, y; } p[N]; 54 int fa[N]; 55 int get(int x) { return x == fa[x] ? x : fa[x] = get(fa[x]); } 56 double dis(int i, int j) { return sqrt(pow(p[i].x - p[j].x, 2) + pow(p[i].y - p[j].y, 2)); } 57 bool check(double r) { 58 for(int i = 1 ; i <= k + 2 ; ++ i) fa[i] = i; 59 for(int i = 1 ; i <= k ; ++ i) { 60 if(p[i].y <= r * 2) fa[get(i)] = get(k + 1); 61 if(m - p[i].y <= r * 2) fa[get(i)] = get(k + 2); 62 } 63 for(int i = 1 ; i <= k ; ++ i) { 64 for(int j = i + 1 ; j <= k ; ++ j) { 65 if(dis(i, j) <= r * 2) { 66 fa[get(i)] = get(j); 67 } 68 } 69 } 70 if(get(k + 1) == get(k + 2)) return 0; 71 return 1; 72 } 73 int main() { 74 freopen("starway.in", "r", stdin); 75 freopen("starway.out", "w", stdout); 76 scanf("%d%d%d", &n, &m, &k); 77 for(int i = 1 ; i <= k ; ++ i) scanf("%d%d", &p[i].x, &p[i].y); 78 double l = 0, r = m; 79 for(int i = 1 ; i <= 40 ; ++ i) { 80 double mid = (l + r) / 2; 81 if(check(mid)) l = mid; 82 else r = mid; 83 } 84 printf("%.10lf\n", l); 85 }
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize(3) 3 %:pragma GCC optimize("Ofast") 4 %:pragma GCC optimize("inline") 5 %:pragma GCC optimize("-fgcse") 6 %:pragma GCC optimize("-fgcse-lm") 7 %:pragma GCC optimize("-fipa-sra") 8 %:pragma GCC optimize("-ftree-pre") 9 %:pragma GCC optimize("-ftree-vrp") 10 %:pragma GCC optimize("-fpeephole2") 11 %:pragma GCC optimize("-ffast-math") 12 %:pragma GCC optimize("-fsched-spec") 13 %:pragma GCC optimize("unroll-loops") 14 %:pragma GCC optimize("-falign-jumps") 15 %:pragma GCC optimize("-falign-loops") 16 %:pragma GCC optimize("-falign-labels") 17 %:pragma GCC optimize("-fdevirtualize") 18 %:pragma GCC optimize("-fcaller-saves") 19 %:pragma GCC optimize("-fcrossjumping") 20 %:pragma GCC optimize("-fthread-jumps") 21 %:pragma GCC optimize("-funroll-loops") 22 %:pragma GCC optimize("-fwhole-program") 23 %:pragma GCC optimize("-freorder-blocks") 24 %:pragma GCC optimize("-fschedule-insns") 25 %:pragma GCC optimize("inline-functions") 26 %:pragma GCC optimize("-ftree-tail-merge") 27 %:pragma GCC optimize("-fschedule-insns2") 28 %:pragma GCC optimize("-fstrict-aliasing") 29 %:pragma GCC optimize("-fstrict-overflow") 30 %:pragma GCC optimize("-falign-functions") 31 %:pragma GCC optimize("-fcse-skip-blocks") 32 %:pragma GCC optimize("-fcse-follow-jumps") 33 %:pragma GCC optimize("-fsched-interblock") 34 %:pragma GCC optimize("-fpartial-inlining") 35 %:pragma GCC optimize("no-stack-protector") 36 %:pragma GCC optimize("-freorder-functions") 37 %:pragma GCC optimize("-findirect-inlining") 38 %:pragma GCC optimize("-fhoist-adjacent-loads") 39 %:pragma GCC optimize("-frerun-cse-after-loop") 40 %:pragma GCC optimize("inline-small-functions") 41 %:pragma GCC optimize("-finline-small-functions") 42 %:pragma GCC optimize("-ftree-switch-conversion") 43 %:pragma GCC optimize("-foptimize-sibling-calls") 44 %:pragma GCC optimize("-fexpensive-optimizations") 45 %:pragma GCC optimize("-funsafe-loop-optimizations") 46 %:pragma GCC optimize("inline-functions-called-once") 47 %:pragma GCC optimize("-fdelete-null-pointer-checks") 48 #include <bits/stdc++.h> 49 using namespace std; 50 const int N = 6010; 51 const double inf = 1e60; 52 int n, m, k; 53 struct P { int x, y; } p[N]; 54 int vis[N]; double dis[N]; 55 double getdis(int i, int j) { return sqrt(pow(p[i].x - p[j].x, 2) + pow(p[i].y - p[j].y, 2)); } 56 int main() { 57 freopen("starway.in", "r", stdin); 58 freopen("starway.out", "w", stdout); 59 scanf("%d%d%d", &n, &m, &k); 60 for(int i = 1 ; i <= k ; ++ i) scanf("%d%d", &p[i].x, &p[i].y); 61 for(int i = 1 ; i <= k ; ++ i) dis[i] = m - p[i].y; 62 dis[k + 1] = m; 63 dis[0] = inf; 64 double ans = 0; 65 while(1) { 66 int id = 0; 67 for(int i = 1 ; i <= k + 1 ; ++ i) if(!vis[i] && dis[i] < dis[id]) id = i; 68 ans = max(ans, dis[id]); 69 if(id == k + 1) break; 70 for(int i = 1 ; i <= k ; ++ i) dis[i] = min(dis[i], getdis(i, id)); 71 dis[k + 1] = min(dis[k + 1], (double) p[id].y); 72 vis[id] = 1; 73 } 74 printf("%.10lf\n", ans / 2); 75 }