Advertisement
Galebickosikasa

Untitled

Jan 28th, 2021
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <unordered_map>
  9. #include <set>
  10. #include <map>
  11. #include <queue>
  12. #include <random>
  13. #include <chrono>
  14.  
  15. #define fi first
  16. #define se second
  17. #define pb push_back
  18. #define ll long long
  19. #define ld long double
  20. #define hm unordered_map
  21. #define pii pair<int, int>
  22. #define sz(a) (int)a.size()
  23. #define all(a) a.begin(), a.end()
  24. #define cinv(v) for (auto& x: v) cin >> x
  25. #define fr(i, n) for (int i = 0; i < n; ++i)
  26. #define fl(i, l, n) for (int i = l; i < n; ++i)
  27.  
  28. #define int ll
  29.  
  30. template <typename T1, typename T2> inline bool chkmin(T1 &x, const T2 &y) {if (x > y) {x = y; return 1;} return 0;}
  31. template <typename T1, typename T2> inline bool chkmax(T1 &x, const T2 &y) {if (x < y) {x = y; return 1;} return 0;}
  32.  
  33. using namespace std;
  34.  
  35. #ifdef LOCAL
  36. #define dbg(x) cerr << #x << " : " << x << '\n'
  37. #else
  38. #define dbg(x)
  39. #endif
  40.  
  41. //tg: @runningcherry
  42.  
  43. template <typename T1, typename T2> ostream& operator << (ostream& out, const pair<T1, T2>& v) {
  44. out << v.fi << ", " << v.se;
  45. return out;
  46. }
  47.  
  48. template<typename T> ostream& operator << (ostream& out, const vector<T>& v) {
  49. for (auto& x: v) out << x << " ";
  50. return out;
  51. }
  52.  
  53. template <typename T1, typename T2> istream& operator >> (istream& in, pair<T1, T2>& a) {
  54. in >> a.fi >> a.se;
  55. return in;
  56. }
  57.  
  58. const ll inf = (ll) 2e9;
  59. const ld pi = asin (1) * 2;
  60. const ld eps = 1e-8;
  61. const ll mod = (ll)1e9 + 7;
  62. const ll ns = 97;
  63.  
  64. const int maxn = 1e5 + 20;
  65.  
  66. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  67.  
  68. struct re {
  69. int l, r, i, c, f;
  70.  
  71. inline bool operator < (const re& other) const {
  72. if (l != other.l) return l < other.l;
  73. return r < other.r;
  74. }
  75. };
  76.  
  77. vector<re> edges, eb;
  78. vector<int> g[maxn];
  79. int used[maxn];
  80.  
  81. int dfs (int v, int t, int c = inf) {
  82. used[v] = 1;
  83. if (v == t) return c;
  84. for (auto& u: g[v]) {
  85. if (!used[edges[u].r + 1] && edges[u].c - edges[u].f > 0) {
  86. int delta = dfs (edges[u].r + 1, min (c, edges[u].c - edges[u].f));
  87. if (delta > 0) {
  88. auto& e = edges[u];
  89. auto& _e = edges[u^1];
  90. e.f += delta;
  91. _e.f -= delta;
  92. return delta;
  93. }
  94. }
  95. }
  96. return 0;
  97. }
  98.  
  99. void dfs (int v, int t, vector<int>& order) {
  100. if (v == t) return;
  101. for (auto& u: g[v]) {
  102. if (edges[u].c - edges[u].f > 0) {
  103. order.pb (edges[u].i);
  104. dfs (edges[u].r + 1, t, order);
  105. auto& e = edges[u];
  106. auto& _e = edges[u^1];
  107. e.f -= 1;
  108. _e.f += 1;
  109. return;
  110. }
  111. }
  112. }
  113.  
  114. int EB = -1;
  115.  
  116. void answer (int s, int t) {
  117. vector<int> order;
  118. dfs (s, t, order);
  119. vector<int> ans (sz (edges) + sz (eb));
  120. if (EB != -1) ans[EB] = 1;
  121. for (auto& x: order) {
  122. if (x != -1) ans[x] = 1;
  123. }
  124. cout << ans << '\n';
  125. exit (0);
  126. }
  127.  
  128. signed main () {
  129. ios_base::sync_with_stdio(false);
  130. cin.tie(nullptr);
  131. cout.tie(nullptr);
  132. int n, m;
  133. cin >> n >> m;
  134. vector<pii> goo;
  135. fr (i, m) {
  136. int a, b;
  137. cin >> a >> b;
  138. if (a <= b) {
  139. fl (j, a, b + 1) g[j].pb (sz (edges));
  140. edges.pb ({a, b, i, 1, 0});
  141. fl (j, a, b + 1) g[j].pb (sz (edges));
  142. edges.pb ({a, b, i, 0, 0});
  143. }
  144. else eb.pb ({a, b, i, 1, 0});
  145. goo.pb ({a, b});
  146. }
  147.  
  148. int S = n + 2, T = n + 3;
  149. g[S].pb (sz (edges));
  150. edges.pb ({0, 0, -1, 2, 0});
  151. g[1].pb (sz (edges));
  152. edges.pb ({0, n + 1, -1, 0, 0});
  153. g[n + 1].pb (sz (edges));
  154. edges.pb ({n + 1, n + 2, -1, 2, 0});
  155. g[T].pb (sz (edges));
  156. edges.pb ({0, n, -1, 0, 0});
  157. while (dfs (S, T)) {
  158. fr (i, T + 1) used[i] = 0;
  159. }
  160. int res = 0;
  161. for (auto& e: g[S]) res += edges[e].f;
  162. if (res >= 2) answer (S, T);
  163. g[S].pop_back ();
  164. g[1].pop_back ();
  165. g[n + 1].pop_back ();
  166. g[T].pop_back ();
  167. fr (i, 4) edges.pop_back ();
  168. fr (i, sz (eb)) {
  169. g[S].pb (sz (edges));
  170. edges.pb ({0, eb[i].l, -1, 1, 0});
  171. g[eb[i].l + 1].pb (sz (edges));
  172. edges.pb ({0, S - 1, -1, 0, 0});
  173. g[S].pb (sz (edges));
  174. edges.pb ({0, 0, -1, 1, 0});
  175. g[1].pb (sz (edges));
  176. edges.pb ({0, S - 1, -1, 0, 0});
  177. g[eb[i].r + 1].pb (sz (edges));
  178. edges.pb ({0, T - 1, -1, 1, 0});
  179. g[T].pb (sz (edges));
  180. edges.pb ({0, eb[i].r, -1, 0, 0});
  181. g[n + 1].pb (sz (edges));
  182. edges.pb ({0, T - 1, -1, 1, 0});
  183. g[T].pb (sz (edges));
  184. edges.pb ({0, n, -1, 0, 0});
  185. while (dfs (S, T)) {
  186. fr (i, T + 1) used[i] = 0;
  187. }
  188. res = 0;
  189. for (auto& e: g[S]) res += edges[e].f;
  190. if (res >= 2) {
  191. EB = eb[i].i;
  192. answer (S, T);
  193. }
  194. fr (i, 2) g[S].pop_back ();
  195. fr (i, 2) g[T].pop_back ();
  196. g[eb[i].l + 1].pop_back ();
  197. g[eb[i].r + 1].pop_back ();
  198. g[1].pop_back ();
  199. g[n + 1].pop_back ();
  200. fr (i, 8) edges.pop_back ();
  201. fr (j, sz (eb)) {
  202. if (i == j) continue;
  203. g[S].pb (sz (edges));
  204. edges.pb ({0, eb[i].l, -1, 1, 0});
  205. g[eb[i].l + 1].pb (sz (edges));
  206. edges.pb ({0, S - 1, -1, 0, 0});
  207.  
  208. g[S].pb (sz (edges));
  209. edges.pb ({0, eb[j].l, -1, 1, 0});
  210. g[eb[j].l + 1].pb (sz (edges));
  211. edges.pb ({0, S - 1, -1, 0, 0});
  212.  
  213. g[eb[i].r + 1].pb (sz (edges));
  214. edges.pb ({0, T - 1, -1, 1, 0});
  215. g[T].pb (sz (edges));
  216. edges.pb ({0, eb[i].r, -1, 0, 0});
  217.  
  218. g[eb[j].r + 1].pb (sz (edges));
  219. edges.pb ({0, T - 1, -1, 1, 0});
  220. g[T].pb (sz (edges));
  221. edges.pb ({0, eb[j].r, -1, 0, 0});
  222.  
  223. while (dfs (S, T)) {
  224. fr (i, T + 1) used[i] = 0;
  225. }
  226. res = 0;
  227. for (auto& e: g[S]) res += edges[e].f;
  228. if (res >= 2) {
  229. EB = eb[i].i;
  230. answer (S, T);
  231. }
  232. fr (i, 2) g[S].pop_back ();
  233. fr (i, 2) g[T].pop_back ();
  234. g[eb[i].l + 1].pop_back ();
  235. g[eb[i].r + 1].pop_back ();
  236. g[eb[j].l + 1].pop_back ();
  237. g[eb[j].r + 1].pop_back ();
  238. fr (i, 8) edges.pop_back ();
  239. }
  240. }
  241. cout << "impossible\n";
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement