fork download
  1. /*
  2. * @Author: hungeazy
  3. * @Date: 2025-12-26 16:42:50
  4. * @Last Modified by: hungeazy
  5. * @Last Modified time: 2025-12-26 17:07:32
  6. */
  7. #include <bits/stdc++.h>
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. #include <ext/pb_ds/tree_policy.hpp>
  10. // #pragma GCC optimize("O3")
  11. // #pragma GCC optimize("unroll-loops")
  12. // #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
  13. using namespace std;
  14. using namespace __gnu_pbds;
  15. bool M1;
  16. #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  17. #define int long long
  18. #define ll long long
  19. #define lb long double
  20. #define ull unsigned long long
  21. #define sz(x) x.size()
  22. #define sqr(x) (1LL * (x) * (x))
  23. #define all(x) x.begin(), x.end()
  24. #define fill(f,x) memset(f,x,sizeof(f))
  25. #define FOR(i,l,r) for(int i=l;i<=r;i++)
  26. #define FOD(i,r,l) for(int i=r;i>=l;i--)
  27. #define debug(x) cout << #x << " = " << x << '\n'
  28. #define ii pair<int,int>
  29. #define iii pair<int,ii>
  30. #define di pair<ii,ii>
  31. #define vi vector<int>
  32. #define vii vector<ii>
  33. #define mii map<int,int>
  34. #define fi first
  35. #define se second
  36. #define pb push_back
  37. #define MOD 1000000007
  38. #define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
  39. #define YES cout << "YES\n"
  40. #define NO cout << "NO\n"
  41. #define MASK(i) (1LL << (i))
  42. #define c_bit(i) __builtin_popcountll(i)
  43. #define BIT(x,i) ((x) & MASK(i))
  44. #define SET_ON(x,i) ((x) | MASK(i))
  45. #define SET_OFF(x,i) ((x) & ~MASK(i))
  46. #define oo 1e18
  47. #define name "CAMP"
  48. #define endl '\n'
  49. #define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
  50. // #define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
  51. template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
  52. template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
  53. template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
  54. const int N = (int)1e5+10;
  55. int k,alpha[N];
  56. lb A;
  57. mt19937_64 rnd;
  58.  
  59. namespace hungeazy {
  60.  
  61. const lb PI = acos(-1), eps = 1e-14;
  62. pair<lb,lb> a[N];
  63.  
  64. struct DSU {
  65. int par[N],sz[N];
  66.  
  67. void init(int n) {
  68. FOR(i,1,n)
  69. {
  70. par[i] = i;
  71. sz[i] = 1;
  72. }
  73. }
  74.  
  75. int acs(int u) {
  76. return (u == par[u] ? u : par[u] = acs(par[u]));
  77. }
  78.  
  79. bool join(int u, int v)
  80. {
  81. int x = acs(u), y = acs(v);
  82. if (x != y)
  83. {
  84. if (sz[x] < sz[y]) swap(x,y);
  85. sz[x] += sz[y];
  86. par[y] = x;
  87. return true;
  88. }
  89. return false;
  90. }
  91. } dsu;
  92.  
  93. int randRange(int l, int r) {
  94. return uniform_int_distribution<int>(l,r)(rnd);
  95. }
  96.  
  97. lb getDist(pair<lb,lb> x, pair<lb,lb> y) {
  98. return sqrt(sqr(x.fi-y.fi)+sqr(x.se-y.se));
  99. }
  100.  
  101. void solve(void)
  102. {
  103. FOR(i,1,k) a[i] = {100*cos((alpha[i]*PI)/180),100*sin((alpha[i]*PI)/180)};
  104. lb mnX = oo, mnY = oo, mxX = -oo, mxY = -oo;
  105. FOR(i,1,k)
  106. {
  107. if (a[i].fi >= 0 and a[i].fi <= eps) a[i].fi = 0;
  108. if (a[i].se >= 0 and a[i].se <= eps) a[i].se = 0;
  109. minimize(mnX,a[i].fi);
  110. maximize(mxX,a[i].fi);
  111. minimize(mnY,a[i].se);
  112. maximize(mxY,a[i].se);
  113. }
  114. vii best;
  115. vector<pair<lb,lb>> add;
  116. lb ans = oo;
  117. while (true)
  118. {
  119. vector<pair<lb,lb>> vec;
  120. int len = randRange(1,25);
  121. FOR(i,1,k) vec.pb(a[i]);
  122. while ((int)sz(vec) < len+k)
  123. {
  124. int x = randRange(mnX,mxX), y = randRange(mnY,mxY);
  125. vec.pb({x,y});
  126. }
  127. vector<iii> edges;
  128. int tmp = sz(vec);
  129. FOR(i,0,tmp-1)
  130. FOR(j,i+1,tmp-1)
  131. edges.pb({getDist(vec[i],vec[j]),{i+1,j+1}});
  132. sort(all(edges));
  133. dsu.init(len+k);
  134. vii cur;
  135. lb sum = 0;
  136. int tplt = sz(vec);
  137. for (iii val : edges)
  138. {
  139. int u,v; lb w;
  140. w = val.fi;
  141. tie(u,v) = val.se;
  142. if (dsu.join(u,v))
  143. {
  144. sum += w;
  145. cur.pb({u,v});
  146. tplt--;
  147. }
  148. }
  149. if (tplt == 1 and minimize(ans,sum))
  150. {
  151. add = vec;
  152. best = cur;
  153. }
  154. if (sum <= A) break;
  155. if ((1000.0*clock())/CLOCKS_PER_SEC >= 2700) break;
  156. }
  157. debug(ans);
  158. int len = sz(add)-k, tmp = sz(add);
  159. cout << len << endl;
  160. FOR(i,k,tmp-1) cout << fixed << setprecision(4) << add[i].fi*1.0 << " " << add[i].se*1.0 << endl;
  161. for (ii x : best)
  162. {
  163. int u,v;
  164. tie(u,v) = x;
  165. cout << u << " " << v << endl;
  166. }
  167. }
  168.  
  169. }
  170.  
  171. bool M2;
  172. signed main()
  173. {
  174. fast; rnd.seed(time(0));
  175. if (fopen(name".inp","r"))
  176. {
  177. freopen(name".inp","r",stdin);
  178. freopen(name".out","w",stdout);
  179. }
  180. cin >> k;
  181. FOR(i,1,k) cin >> alpha[i];
  182. cin >> A;
  183. hungeazy::solve();
  184. // time();
  185. memory();
  186. return 0;
  187. }
  188. // ██░ ██ █ ██ ███▄ █ ▄████
  189. //▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
  190. //▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
  191. //░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
  192. //░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
  193. // ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
  194. // ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
  195. // ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
  196. // ░ ░ ░ ░ ░ ░
Success #stdin #stdout #stderr 0.01s 5892KB
stdin
Standard input is empty
stdout
ans = -3.68935e+19
5
8090205604394940599.0000 7620840502787901182.0000
1276734965438855247.0000 -2846131636890370098.0000
4534533016381449197.0000 -4475784006150002930.0000
-4278574640396219322.0000 -7287632216004227902.0000
-8124974721037282842.0000 -5382321045623011009.0000
1 2
1 3
1 4
1 5
stderr
5.34356 MB