Advertisement
Guest User

usaco 866 gathering

a guest
Dec 14th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define pii pair<int,int>
  4. #define pll pair<ll,ll>
  5. #define pli pair<ll,int>
  6. #define fi first
  7. #define se second
  8. #define inf (INT_MAX/2-1)
  9. #define infl (1LL<<60)
  10. #define vi vector<int>
  11. #define pb push_back
  12. #define sz(a) (int)(a).size()
  13. #define all(a) begin(a),end(a)
  14. #define y0 y5656
  15. #define y1 y7878
  16. #define aaa system("pause");
  17. #define dbg(x) cerr<<(#x)<<": "<<(x)<<'\n',aaa
  18. #define dbga(x,n) cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)cerr<<x[_]<<' ';cerr<<'\n',aaa
  19. #define dbgs(x) cerr<<(#x)<<"[stl]: ";for(auto _:x)cerr<<_<<' ';cerr<<'\n',aaa
  20. #define dbgp(x) cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
  21. #define maxn 100000
  22. #define ml2 18
  23.  
  24. using namespace std;
  25.  
  26. ifstream fin ("gathering.in");
  27. ofstream fout ("gathering.out");
  28.  
  29. int n, m;
  30. vi g[maxn+5], fii[maxn+5], tour, g2[maxn+5];
  31. int rmq[2*maxn+5][ml2+5], lg[2*maxn+5], fapr[maxn+5], niv[maxn+5], ans[maxn+5];
  32. bool ancestor[maxn+5], viz[maxn+5];
  33.  
  34. void dfsi (int nod, int t) {
  35.   if (nod != 0) niv[nod] = 1+niv[t];
  36.   for (int nn: g[nod])
  37.     if (nn != t) fii[nod].pb(nn), dfsi(nn, nod);
  38. }
  39.  
  40. void dfst (int nod) {
  41.   if (fapr[nod] == -1) fapr[nod] = sz(tour);
  42.   tour.pb(nod);
  43.   for (int nn: fii[nod]) dfst(nn), tour.pb(nod);
  44. }
  45.  
  46. void prelca () {
  47.   fill(all(fapr), -1);
  48.   dfst(0);
  49.   int i, j;
  50.   for (i = 2; i <= sz(tour); i++) lg[i] = 1+lg[i>>1];
  51.   for (i = 0; i < sz(tour); i++) rmq[i][0] = tour[i];
  52.   for (j = 1; j <= lg[sz(tour)]; j++)
  53.     for (i = 0; i+(1<<j)-1 < sz(tour); i++) { ///-1!!
  54.       rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
  55.       if (niv[rmq[i][j]] > niv[rmq[i][j-1]]) rmq[i][j] = rmq[i][j-1];
  56.     }
  57. }
  58.  
  59. int lca (int a, int b) {
  60.   if (fapr[a] > fapr[b]) swap(a, b);
  61.   int ile = lg[fapr[b]-fapr[a]+1];
  62.   int x = rmq[fapr[a]][ile], y = rmq[fapr[b]-(1<<ile)+1][ile];///1<<!
  63.   if (niv[x] < niv[y]) return x;
  64.   return y;
  65. }
  66.  
  67. int dist (int a, int b) {
  68.   int c = lca(a, b);
  69.   return niv[a] + niv[b] - 2*niv[c];
  70. }
  71.  
  72. void dfs (int nod, int prew, int b) {
  73.   if (ans[nod] == 0) return;
  74.   if (dist(nod, b) < dist(prew, b)) return;
  75.   ans[nod] = 0;
  76.   for (int nn: g[nod]) dfs(nn, nod, b);
  77. }
  78.  
  79. void special () {
  80.   for (int i = 0; i < n; i++) fout << 0 << '\n';
  81.   exit(0);
  82. }
  83.  
  84. void dfsc (int nod) {
  85.   viz[nod] = 1;
  86.   ancestor[nod] = 1;
  87.   for (int nn: g2[nod]) {
  88.     if (ancestor[nn]) special();
  89.     dfsc(nn);
  90.   }
  91.   ancestor[nod] = 0;
  92. }
  93.  
  94. int main () {
  95.   fin >> n >> m;
  96.   int i, a, b;
  97.   for (i = 0; i < n-1; i++) {
  98.     fin >> a >> b; a--; b--;
  99.     g[a].pb(b);
  100.     g[b].pb(a);
  101.   }
  102.   dfsi(0, -1);
  103.   prelca();
  104.   fill(all(ans), 1);
  105.   for (i = 0; i < m; i++) {
  106.     fin >> a >> b; a--; b--;
  107.     g2[a].pb(b);
  108.     ans[a] = 0;
  109.     for (int nn: g[a]) dfs (nn, a, b);
  110.   }
  111.   for (i = 0; i < n; i++)
  112.     if (!viz[i]) dfsc (i);
  113.   for (i = 0; i < n; i++) fout << ans[i] << '\n';
  114.   fin.close(); fout.close();
  115.   return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement