Advertisement
a53

wall

a53
Dec 6th, 2021
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <utility>
  5. #include <tuple>
  6. #include <algorithm>
  7. #define endl '\n'
  8. using namespace std;
  9.  
  10. const int MAXN = 500005;
  11. const int INF = 1 << 30;
  12.  
  13. int n, m, w, h;
  14. int lev[MAXN], idx[MAXN], vis[MAXN], rem[MAXN];
  15.  
  16. vector<int> g[MAXN][2];
  17. vector<vector<int>> order;
  18. tuple<int, int, int> pos[MAXN];
  19. pair<int, int> range[MAXN];
  20. vector<int> active, nxt[MAXN];
  21.  
  22. bool comp(int x, int y)
  23. {
  24. return pos[x] < pos[y];
  25. }
  26.  
  27. void Init()
  28. {
  29. ios :: sync_with_stdio(false);
  30. cin.tie(NULL); cout.tie(NULL);
  31.  
  32. cin >> n >> m;
  33. for (int i = 1; i <= m; ++ i)
  34. {
  35. int u, d;
  36. cin >> u >> d;
  37. g[u][0].push_back(d);
  38. g[d][1].push_back(u);
  39. }
  40. int b;
  41. cin >> b;
  42. }
  43.  
  44. void CalcLevels(int u, int l)
  45. {
  46. lev[u] = l;
  47. h = max(h, lev[u]);
  48. for (int v : g[u][0])
  49. {
  50. if (lev[v] == 0) CalcLevels(v, l + 1);
  51. }
  52. }
  53.  
  54. int level, minv, maxv;
  55.  
  56. void Enumerate(int u, int d)
  57. {
  58. vis[u] = 1;
  59. int dir = (lev[u] == level) ? 0 : 1;
  60. for (int v : g[u][dir])
  61. {
  62. if (vis[v] != 0 or g[v][dir ^ 1].size() == 1) continue;
  63. get<2>(pos[v]) = get<2>(pos[u]) + d;
  64. Enumerate(v, d);
  65. d += 2;
  66. }
  67. }
  68.  
  69. void SortLevel(int l)
  70. {
  71. for (int i = l; i <= l + 1; ++ i)
  72. {
  73. if (i > h) break;
  74. for (int j : order[l])
  75. {
  76. vis[j] = 0;
  77. }
  78. }
  79.  
  80. if (l == 1)
  81. {
  82. for (int u : order[1])
  83. {
  84. get<0>(pos[u]) = 0;
  85. get<1>(pos[u]) = 0;
  86. }
  87. }
  88. else
  89. {
  90. for (int u : order[l])
  91. {
  92. int mini = +INF, maxi = -INF;
  93. for (int v : g[u][1])
  94. {
  95. mini = min(mini, idx[v]);
  96. maxi = max(maxi, idx[v]);
  97. }
  98. get<0>(pos[u]) = mini;
  99. get<1>(pos[u]) = maxi;
  100. }
  101. }
  102.  
  103. vector<int> equ;
  104. int start = 0;
  105. for (int i = 0; i < order[l].size(); ++ i)
  106. {
  107. int u = order[l][i];
  108. if (g[u][0].size() == 1)
  109. {
  110. int v = g[u][0][0];
  111. if (vis[v] != -1) equ.push_back(v);
  112. else vis[v] = -1;
  113. }
  114. else start = u;
  115. }
  116. for (int v : equ) vis[v] = 0;
  117.  
  118. level = l;
  119. minv = maxv = 0;
  120. get<2>(pos[start]) = 0;
  121. if (start != 0) Enumerate(start, -1);
  122.  
  123. for (int v : equ)
  124. {
  125. for (int u : g[v][1])
  126. {
  127. if (g[u][0].size() == 1)
  128. {
  129. get<2>(pos[u]) = get<2>(pos[v]);
  130. }
  131. }
  132. }
  133.  
  134. for (int u : order[l])
  135. {
  136. if (minv == 0 or get<2>(pos[u]) < get<2>(pos[minv])) minv = u;
  137. else if (get<2>(pos[u]) == get<2>(pos[minv]) and pos[u] > pos[minv]) minv = u;
  138. if (maxv == 0 or get<2>(pos[u]) > get<2>(pos[maxv])) maxv = u;
  139. else if (get<2>(pos[u]) == get<2>(pos[maxv]) and pos[u] < pos[maxv]) maxv = u;
  140. }
  141.  
  142. if (pos[minv] > pos[maxv])
  143. {
  144. for (int u : order[l])
  145. {
  146. get<2>(pos[u]) *= -1;
  147. }
  148. }
  149.  
  150. sort(order[l].begin(), order[l].end(), comp);
  151. for (int i = 0; i < order[l].size(); ++ i)
  152. {
  153. idx[order[l][i]] = i;
  154. }
  155. }
  156.  
  157. void Solve()
  158. {
  159. for (int i = 1; i <= n; ++ i)
  160. {
  161. int above = 0, below = 0;
  162. for (int j : g[i][0])
  163. {
  164. if (below == 0 or idx[below] < idx[j]) below = j;
  165. }
  166. for (int j : g[i][1])
  167. {
  168. if (above == 0 or idx[above] < idx[j]) above = j;
  169. }
  170.  
  171. if (above != 0 and idx[above] != 0)
  172. {
  173. nxt[above].push_back(i);
  174. rem[i]++;
  175. }
  176. if (below != 0 and idx[below] != 0)
  177. {
  178. nxt[below].push_back(i);
  179. rem[i]++;
  180. }
  181. if (idx[i] != 0) rem[i]++;
  182. }
  183.  
  184. queue<int> q;
  185. active.resize(h + 1);
  186. for (int i = 1; i <= h; ++ i)
  187. {
  188. active[i] = 0;
  189. range[order[i].front()].first = 0;
  190. if (rem[order[i][0]] == 0) q.push(order[i][0]);
  191. }
  192.  
  193. while (!q.empty())
  194. {
  195. w++;
  196. queue<int> qnew;
  197. while (!q.empty())
  198. {
  199. int e = q.front();
  200. q.pop();
  201. int l = lev[e];
  202. if (active[l] + 1 != order[l].size())
  203. {
  204. int enew = order[l][++active[l]];
  205. range[e].second = w;
  206. range[enew].first = w;
  207.  
  208. if (--rem[enew] == 0) qnew.push(enew);
  209. for (int f : nxt[enew])
  210. {
  211. rem[f]--;
  212. if (rem[f] == 0) qnew.push(f);
  213. }
  214. }
  215. }
  216. swap(q, qnew);
  217. }
  218.  
  219. for (int i = 1; i <= h; ++ i)
  220. {
  221. range[order[i].back()].second = w;
  222. }
  223. }
  224.  
  225. int main()
  226. {
  227. Init();
  228.  
  229. for (int i = 1; i <= n; ++ i)
  230. {
  231. if (g[i][1].size() == 0) CalcLevels(i, 1);
  232. }
  233.  
  234. order.resize(h + 1);
  235. for (int i = 1; i <= n; ++ i)
  236. {
  237. order[lev[i]].push_back(i);
  238. }
  239.  
  240. for (int i = 1; i <= h; ++ i)
  241. {
  242. SortLevel(i);
  243. }
  244.  
  245. Solve();
  246.  
  247. cout << h << ' ' << w << endl;
  248. for (int i = 1; i <= h; ++ i)
  249. {
  250. cout << order[i].size();
  251. for (int s : order[i])
  252. {
  253. cout << ' ' << s << ' ' << range[s].second - range[s].first;
  254. }
  255. cout << endl;
  256. }
  257. return 0;
  258. }
  259.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement