Advertisement
Arrias

Untitled

Jul 14th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define __int32 signed
  4. #define log ropeorp
  5.  
  6. using namespace std;
  7.  
  8. const int NMAX = 130;
  9. const int INF = 1e18;
  10. const int LIM = 10;
  11. const int MOD = 1e9 + 7;
  12.  
  13. int n, m, k, s;
  14. int log[NMAX];
  15. int deg[NMAX];
  16.  
  17. struct rectangle {
  18. int x1, y1; // левый верхний
  19. int x2, y2; // правый нижний
  20. } a[NMAX][NMAX];
  21.  
  22. rectangle dp[NMAX][NMAX][LIM][LIM];
  23.  
  24. inline void pre_calc_deg(void) {
  25. deg[0] = 1;
  26. for (int i = 1; i < NMAX; ++i) deg[i] = (deg[i - 1] * 2) % MOD;
  27. }
  28.  
  29. inline void pre_calc_log(void) {
  30. log[0] = log[1] = 0;
  31. for (int i = 2; i < NMAX; ++i) log[i] = log[i / 2] + 1;
  32. }
  33.  
  34.  
  35. rectangle overall_cut(rectangle a, rectangle b) {
  36. // (ax1, ay1) (ax2, ay2) - прямоугольник A
  37. // (bx1, by1) (bx2, by2) - прямоугольник B
  38.  
  39. int ax1 = a.x1;
  40. int ay1 = a.y1;
  41. int ax2 = a.x2;
  42. int ay2 = a.y2;
  43.  
  44. int bx1 = b.x1;
  45. int by1 = b.y1;
  46. int bx2 = b.x2;
  47. int by2 = b.y2;
  48.  
  49.  
  50. if ((ax1 == -INF) or (bx1 == -INF)) return rectangle{-INF,-INF,-INF,-INF};
  51.  
  52. if (ay2>by1 || ay1<by2 || ax1 > bx2 || ax2 <bx1) {
  53. return rectangle{-INF,-INF,-INF,-INF};
  54. }
  55. else {
  56. int cy1, cy2, cx1, cx2;
  57. cy1 = min(ay1, by1);
  58. cx1 = max(ax1, bx1);
  59. cy2 = max(ay2, by2);
  60. cx2 = min(ax2, bx2);
  61. return rectangle{cx1, cy1, cx2, cy2};
  62. }
  63.  
  64. }
  65.  
  66. int sq(rectangle a) {
  67. return (abs(a.x1 - a.x2) * abs(a.y1 - a.y2));
  68. }
  69.  
  70. __int32 main() {
  71.  
  72. //precalc
  73. pre_calc_deg();
  74. pre_calc_log();
  75.  
  76. int n, m;
  77. cin >> n >> m;
  78.  
  79. for (int i = 0; i < n; ++i) {
  80. for (int j = 0; j < m; ++j) {
  81. rectangle temp;
  82. cin >> temp.x1 >> temp.y1 >> temp.x2 >> temp.y2;
  83. // привести к нормальному виду
  84. if (temp.x1 > temp.x2) swap(temp.x1, temp.x2);
  85. if (temp.y1 < temp.y2) swap(temp.y1, temp.y2);
  86. a[i][j] = temp;
  87. }
  88. }
  89.  
  90. for (int i = 0; i < n; ++i) {
  91. for (int j = 0; j < m; ++j) {
  92. for (int k1 = 0; k1 < LIM; ++k1) {
  93. for (int k2 = 0; k2 < LIM; ++k2) {
  94. if ((k1 == 0) and (k2 == 0)) {
  95. dp[i][j][k1][k2] = a[i][j];
  96. }
  97. }
  98. }
  99. }
  100. }
  101.  
  102. for (int i = 0; i < n; ++i) {
  103. for (int j = 0; j < m; ++j) {
  104. for (int lg = 0; lg < LIM; ++lg) {
  105. dp[i][j][0][lg] = overall_cut(dp[i][j][0][lg - 1], dp[i][j + deg[lg - 1]][0][lg - 1]);
  106. }
  107. }
  108. }
  109.  
  110. for (int k1 = 1; k1 < LIM; ++k1) {
  111. for (int i = 0; i < n; ++i) {
  112. for (int k2 = 1; k2 < LIM; ++k2) {
  113. for (int j = 0; j < m; ++j) {
  114. dp[i][j][k1][k1] = overall_cut(dp[i][j][k1 - 1][k2], dp[i + deg[k1 - 1]][j][k1 - 1][k2]);
  115. }
  116. }
  117. }
  118. }
  119.  
  120. int reu(int i) {
  121. if (i > n) return (i - n);
  122. else return (i);
  123. }
  124.  
  125. pair <double, vector<int>> dij(double x) {
  126. vector <double> d(2 * n + 1, INF); d[x] = 0;
  127. vector <int> way(2 * n + 1, -1);
  128. set <pair<double, int>> que;
  129. que.insert(make_pair(0, x));
  130. while (que.size()) {
  131. auto top = *que.begin();
  132. int from = top.second;
  133. int len = top.first;
  134. que.erase(top);
  135. if (d[from] != top.first) continue;
  136.  
  137. for (auto v : graph[from]) {
  138. if (d[v.first] > d[from] + v.second) {
  139. d[v.first] = d[from] + v.second;
  140. way[v.first] = from;
  141. que.insert(make_pair(d[v.first], v.first));
  142. }
  143. }
  144. }
  145.  
  146. vector <int> result;
  147.  
  148. for (int i = n + 1; i != 1; i = way[i]) {
  149. if (i == -1) break;
  150. if (result.size() == 0 || reu(i) != reu(result.back())) result.push_back(reu(i));
  151. if (i == -1) break;
  152. }
  153.  
  154. return make_pair(d[n + 1], result);
  155. }
  156. cin >> n;
  157.  
  158. vector <pair<double, double>> v; // first - ���������, second - ��������
  159. v.push_back(make_pair(INF, INF));
  160.  
  161. for (int i = 1; i <= n; ++i) {
  162. int a, b;
  163. cin >> a >> b;
  164. v.push_back(make_pair(a, b));
  165. }
  166.  
  167. for (int i = 0; i < n - 1; ++i) {
  168. double a, b, len;
  169. cin >> a >> b >> len;
  170. g[(int)a].push_back(make_pair(b, len));
  171. g[(int)b].push_back(make_pair(a, len));
  172. }
  173.  
  174. for (int i = 1; i <= n; ++i) {
  175. start = i;
  176. dfs(i, 0);
  177. }
  178.  
  179. for (int i = 2; i <= n; ++i) {
  180. graph[i].push_back(make_pair(n + i, v[i].first));
  181. }
  182.  
  183.  
  184. for (int i = 1; i <= n; ++i) {
  185. for (int j = n + 1; j <= 2 * n; ++j) {
  186. if (j != n + i) {
  187. graph[j].push_back(make_pair(i, len[i][j - n] / v[i].second));
  188. }
  189. }
  190. }
  191.  
  192. double ans = -INF;
  193. vector <int> out;
  194.  
  195. double len[N];
  196. fill(len, len + N, INF);
  197. len[n + 1] = 0;
  198. len[1] = 0;
  199.  
  200.  
  201. vector <char> vis(n * 2 + 1, false);
  202. vector <int> p(n * 2 + 1, -1);
  203.  
  204. for (int i = 1; i <= 2 * n; ++i) {
  205. int v = -1;
  206.  
  207. for (int j = 1; j <= 2 * n; ++j) {
  208. if (!vis[j] && (v == -1 || len[j] < len[v])) v = j;
  209. }
  210.  
  211. vis[v] = 1;
  212.  
  213. for (auto t : graph[v]) {
  214. int to = t.first;
  215. double d = t.second;
  216. if (len[v] + d < len[to]) {
  217. len[to] = len[v] + d;
  218. p[to] = v;
  219. }
  220. }
  221.  
  222. }
  223.  
  224. int reg = -1;
  225.  
  226. for (int i = n + 1; i <= 2 * n; ++i) {
  227. if (len[i] > ans) {
  228. ans = len[i];
  229. reg = i;
  230. }
  231. }
  232.  
  233. vector <int> way;
  234.  
  235. for (int i = reg; i != -1; i = p[i]) {
  236. way.push_back(i);
  237. }
  238.  
  239. cout << fixed << setprecision(10) << ans << '\n';
  240.  
  241. for (auto i : way) {
  242. if (i <= n) {
  243. cout << i << ' ';
  244. }
  245. }
  246. cout << 1 << '\n';
  247.  
  248. return 0;
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement