Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <bitset>
  5. #include <cstring>
  6. #include <string.h>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <queue>
  10. #include <stack>
  11. #include <deque>
  12. #include <map>
  13. #include <set>
  14. #include <unordered_set>
  15. #include <unordered_map>
  16. #include <tuple>
  17. #include <vector>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. using namespace std;
  21.  
  22. typedef unsigned long ul;
  23. typedef unsigned long long ull;
  24. typedef long long ll;
  25. typedef pair<int,int> pii;
  26. typedef pair<ll,ll> pll;
  27.  
  28. const ll MOD = 1e9+7;
  29. const ll CFMOD = 998244353;
  30. const double PI = 3.14159265358;
  31. const double EPS = 1e-6;
  32.  
  33. #define INT_MX 2147483647
  34. #define INF ((int)1e9)
  35. #define LLINF ((ll)1e18)
  36. #define F first
  37. #define S second
  38. #define MP(x,y) make_pair(x,y)
  39. #define sz(v) ((int)v.size())
  40. #define rs(n) resize(n)
  41. #define ALL(v) v.begin(),v.end()
  42. #define reset(v, x) memset((v),(x),sizeof(v))
  43. #define EB emplace_back
  44. #define PB push_back
  45. #define PF push_front
  46. #define rep(i,n) for(int i=0;i<(n);i++)
  47. #define rep1(i,n) for(int i=1;i<=(n);i++)
  48. #define REP(i,a,b) for(int i=(a);i<(b);i++)
  49. #define vec vector
  50. #define __ <<' '<<
  51. #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  52.  
  53. #define N 200000
  54.  
  55. vec<int> v[8*N], r[8*N];
  56.  
  57. void add_edge(int a, int b){
  58. v[a].EB(b);
  59. r[b].EB(a);
  60. }
  61.  
  62. int A[4*N + 10], B[4*N + 10], node_cnt, num[N + 10];
  63. void build(int idx, int lb, int rb){
  64. if(lb == rb){
  65. A[idx] = B[idx] = node_cnt;
  66. num[lb] = node_cnt++;
  67. return ;
  68. }
  69. int mid = (lb + rb) / 2;
  70. build(idx * 2, lb, mid);
  71. build(idx * 2 + 1, mid + 1, rb);
  72. A[idx] = node_cnt++;
  73. B[idx] = node_cnt++;
  74. add_edge(A[idx * 2], A[idx]);
  75. add_edge(A[idx * 2 + 1], A[idx]);
  76. add_edge(B[idx], B[idx * 2]);
  77. add_edge(B[idx], B[idx * 2 + 1]);
  78. }
  79.  
  80. void build_edge(int idx, int lb, int rb, int ql, int qr, int v, int type){
  81. if(ql <= lb && rb <= qr){
  82. if(type != 3)
  83. add_edge(num[v], B[idx]);
  84. else
  85. add_edge(A[idx], num[v]);
  86. return ;
  87. }
  88.  
  89. int mid = (lb + rb) / 2;
  90. if(ql <= mid)
  91. build_edge(idx * 2, lb, mid, ql, qr, v, type);
  92. if(qr > mid)
  93. build_edge(idx * 2 + 1, mid + 1, rb, ql, qr, v, type);
  94. }
  95.  
  96. int scc[8*N];
  97. bool vis[8*N];
  98. vec<int> order;
  99.  
  100. void revdfs(int x){
  101. vis[x] = true;
  102. for(int i : r[x]) if(!vis[i])
  103. revdfs(i);
  104. order.EB(x);
  105. }
  106.  
  107. void dfs(int x, int s){
  108. scc[x] = s;
  109. for(int i:v[x]) if(scc[i] == -1)
  110. dfs(i, s);
  111. }
  112.  
  113. void kosaraju(int n){
  114. reset(vis, 0);
  115. reset(scc, -1);
  116.  
  117. rep(i, n) if(!vis[i])
  118. revdfs(i);
  119.  
  120. int nscc = 0;
  121. for(int i = n-1; i >= 0; i--){
  122. int x = order[i];
  123. if(scc[x] == -1){
  124. dfs(x, nscc);
  125. nscc++;
  126. }
  127. }
  128. }
  129.  
  130.  
  131.  
  132.  
  133. void solve(){
  134. int n, m, mxn;
  135. int type, u, l, r;
  136.  
  137. cin >> n >> m;
  138. mxn = 1;
  139. while(mxn < n)
  140. mxn <<= 1;
  141. mxn = n;
  142. build(1, 1, mxn);
  143. rep(i, m){
  144. cin >> type >> u;
  145. if(type == 1) cin >> l , r = l;
  146. else cin >> l >> r;
  147. // l--; r--; u--;
  148. build_edge(1, 1, mxn, l, r, u, type);
  149. }
  150.  
  151. int ipt;
  152. while(true){
  153. cin >> ipt;
  154. for(auto i:v[ipt])
  155. cout << i << ' ';
  156. cout << '\n';
  157. }
  158.  
  159. kosaraju(mxn);
  160.  
  161. vec<int> in_deg;
  162. in_deg.rs(n);
  163.  
  164. rep(i, n)
  165. cout << scc[num[i+1]] << '\n';
  166.  
  167. for(int i = mxn; i < mxn + n; i++){
  168. for(auto j:v[i])
  169. if(0 <= j - mxn && j - mxn < n)
  170. if(scc[i] != scc[j])
  171. in_deg[j - mxn]++;
  172. }
  173.  
  174. rep(i, n)
  175. cout << in_deg[i] << ' ';
  176. cout << '\n';
  177.  
  178. int ans = 0, cnt;
  179. for(int i=mxn; i < mxn + n; i++){
  180. cnt = 0;
  181. for(auto j:v[i])
  182. if(0 <= j - mxn && j - mxn < n)
  183. if(in_deg[j - mxn] == 0)
  184. cnt++;
  185. ans = max(ans, cnt);
  186. }
  187.  
  188. cout << ans << '\n';
  189. }
  190.  
  191. int main() {
  192. int T = 1;
  193.  
  194. //cin >> T;
  195. while(T--){
  196. solve();
  197. }
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement