Advertisement
a53

valori1

a53
Mar 26th, 2020
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxN 10002
  3. #define maxM 40002
  4. #define pii pair<int, int>
  5.  
  6. FILE *fin = freopen("valori.in", "r", stdin);
  7. FILE *fout = freopen("valori.out", "w", stdout);
  8. using namespace std;
  9.  
  10.  
  11. pair <int, int> ArrayValue[maxM];
  12. int posVal[maxN][2];
  13. vector < int > V[2][maxM * 2];
  14. map < pii, int > Map;
  15.  
  16. int ts[maxM * 2];
  17. bool vis[maxM * 2], ans[maxM * 2];
  18.  
  19.  
  20. int N;
  21. void NoSol()
  22. {
  23. printf("-1");
  24. exit(0);
  25. }
  26. int Not(int u)
  27. {
  28. if (u < N) return u + N;
  29. return u - N;
  30. }
  31.  
  32. void dfs(int ty, int u)
  33. {
  34. vis[u] = !ty;
  35. if (ty && ans[u])
  36. {
  37. printf("Node %d is wrong\n ", u);
  38. NoSol();
  39. }
  40. if (ty)
  41. {
  42. ans[u] = false;
  43. ans[Not(u)] = true;
  44. }
  45. int sz = V[ty][u].size();
  46. for (int i = 0; i < sz; ++ i)
  47. {
  48. int v = V[ty][u][i];
  49. if (vis[v] == ty)
  50. dfs(ty, v);
  51. }
  52. if (!ty)
  53. ts[++ ts[0]] = u;
  54. }
  55. void AddEdge(int u, int v)
  56. {
  57. V[0][u].push_back(v);
  58. V[1][v].push_back(u);
  59. }
  60.  
  61. void readInput(int &n, int &m)
  62. {
  63. scanf("%d%d", &n, &m);
  64.  
  65.  
  66. N = 2 * n;
  67. int idx = 0;
  68. for (int i = 0; i < n; ++ i)
  69. {
  70. int ty, val1, val2, x;
  71. scanf("%d %d %d %d", &ty, &x, &val1, &val2);
  72. posVal[x][0] = val1;
  73. posVal[x][1] = val2;
  74. ArrayValue[++ idx] = pii{x, val1};
  75. Map[pii{x, val1}] = idx;
  76. ArrayValue[++ idx] = pii{x, val2};
  77. Map[pii{x, val2}] = idx;
  78. AddEdge(idx - 1, Not(idx - 2));
  79. AddEdge(Not(idx - 1), idx - 2);
  80. AddEdge(idx - 2, Not(idx - 1));
  81. AddEdge(Not(idx - 2), idx - 1);
  82. }
  83. }
  84. void addRestr(int x, int y, int ty)
  85. {
  86. if (ty)
  87. {
  88. AddEdge(x, y);
  89. AddEdge(Not(x), Not(y));
  90. AddEdge(y, x);
  91. AddEdge(Not(y), Not(x));
  92. }else
  93. {
  94. AddEdge(x, Not(y));
  95. AddEdge(y, Not(x));
  96. }
  97. }
  98. void addRestrictions(const int &n, const int &m)
  99. {
  100. for (int i = n; i < m; ++ i)
  101. {
  102. int ty, x, y, val;
  103. scanf("%d%d%d", &ty, &x, &y);
  104.  
  105. if (ty == 1)
  106. {
  107. scanf("%d", &val);
  108.  
  109. map < pii, int >::iterator it1 = Map.find(pii{x, val}),
  110. it2 = Map.find(pii{y, val});
  111. if (it1 == Map.end() && it2 == Map.end())
  112. NoSol();
  113. if (it1 == Map.end())
  114. AddEdge(Not(it2->second - 1), it2->second - 1);
  115. else{
  116. if (it2 == Map.end())
  117. AddEdge(Not(it1->second - 1), it1->second - 1);
  118. else
  119. {
  120. AddEdge(it1->second - 1, Not(it2->second - 1));
  121. AddEdge(it2->second - 1, Not(it1->second - 1));
  122. AddEdge(Not(it1->second - 1), it2->second - 1);
  123. AddEdge(Not(it2->second - 1), it1->second - 1);
  124. }
  125. }
  126. }else
  127. {
  128. for (int t = 0; t < 2; ++ t)
  129. {
  130. map < pii, int >::iterator it = Map.find(pii{y, posVal[x][t]});
  131. if (it == Map.end())
  132. {
  133. int pos = Map[pii{x, posVal[x][t]}] - 1;
  134. if (ty == 3)
  135. AddEdge(pos, Not(pos));
  136.  
  137. continue;
  138. }
  139.  
  140. addRestr(Map[pii{x, posVal[x][t]}] - 1, it->second - 1, ty - 2);
  141.  
  142. }
  143. if (ty == 3)
  144. for (int t = 0; t < 2; ++ t)
  145. {
  146. map < pii, int >::iterator it = Map.find(pii{x, posVal[y][t]});
  147. if (it == Map.end())
  148. {
  149. int pos = Map[pii{y, posVal[y][t]}] - 1;
  150. AddEdge(pos, Not(pos));
  151. }
  152. }
  153.  
  154. }
  155. }
  156. }
  157.  
  158. void solve()
  159. {
  160. for (int i = 0; i < 2 * N; ++ i)
  161. if (!vis[i])
  162. dfs(0, i);
  163.  
  164. for (int i = ts[0]; i > 0; -- i)
  165. if (vis[ts[i]] && vis[Not(ts[i])])
  166. dfs(1, ts[i]);
  167. }
  168. void printAns()
  169. {
  170. for (int i = 0; i < N; ++ i)
  171. if (ans[i] == true)
  172. {
  173. printf("%d ", ArrayValue[i + 1].second);
  174. }
  175. }
  176. int main()
  177. {
  178. int n, m;
  179. readInput(n, m);
  180. addRestrictions(n, m);
  181. solve();
  182. printAns();
  183. return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement