Advertisement
jedrzejd

HLD

Feb 5th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <utility>
  6. #include <vector>
  7. #include <unordered_map>
  8. #define pb push_back
  9. #define f first
  10. #define s second
  11. #define mp make_pair
  12. using namespace std;
  13. const int MXN=1e5+5;
  14. int n,m,a,b,c;
  15. int war[MXN],we[MXN],wy[MXN];
  16. vector<int>tab[MXN];
  17. bool odw[MXN];
  18. int rozmiar[MXN],nastepny[MXN],galaz[MXN],numer[MXN],gora[MXN],gleb[MXN],ojciec[MXN];
  19. int ind[MXN];
  20. unordered_map<int,unordered_map<int,vector<int> > >mapa;
  21. vector<int>mapet[MXN];
  22. inline void dfs(int v){
  23.     odw[v]=1;
  24.     rozmiar[v]=1;
  25.     for(int i=0;i<tab[v].size();i++){
  26.         int u=tab[v][i];
  27.         if(!odw[u]){
  28.             gleb[u]=gleb[v]+1;
  29.             ojciec[u]=v;
  30.             dfs(u);
  31.             rozmiar[v]+=rozmiar[u];
  32.             if(nastepny[v]==-1||rozmiar[u]>rozmiar[nastepny[v]]){
  33.                 nastepny[v]=u;
  34.             }
  35.         }
  36.     }
  37. }
  38. int ktora=1,ilosc;
  39. inline void hld(int v){
  40.     odw[v]=1;
  41.     galaz[v]=ktora;
  42.     if(gora[ktora]==0){
  43.         gora[ktora]=v;
  44.     }
  45.     if(nastepny[v]!=-1){//jesli jestesmy w tej samej sciezce
  46.         ind[nastepny[v]]=ind[v]+1;
  47.         hld(nastepny[v]);
  48.     }
  49.     for(int i=0;i<tab[v].size();i++){
  50.         int u=tab[v][i];
  51.         if(!odw[u]&&nastepny[v]!=u){//przeskakujemy na nastepna
  52.             ktora++;
  53.             ind[u]=1;
  54.             hld(u);
  55.         }
  56.     }
  57. }
  58. int ojc[MXN][20],ia=0;
  59. inline void dfs2(int v){
  60.     odw[v]=1;
  61.     we[v]=ia++;
  62.     for(int i=0;i<tab[v].size();i++){
  63.         int u=tab[v][i];
  64.         if(!odw[u]){
  65.             ojc[u][0]=v;
  66.             dfs2(u);
  67.         }
  68.     }
  69.     wy[v]=ia++;
  70. }
  71. inline bool czy(int a,int b){//czy a jest nad b
  72.     return(we[a]<=we[b]&&wy[a]>=wy[b]);
  73. }
  74. inline int lca(int a,int b){
  75.     if(czy(a,b))return a;
  76.     if(czy(b,a))return b;
  77.     int x=a,skok=18;
  78.     while(skok>=0){
  79.         if(!czy(ojc[x][skok],b)){
  80.             x=ojc[x][skok];
  81.         }
  82.         skok--;
  83.     }
  84.     return ojc[x][0];
  85. }
  86. inline bool szukaj(int a,int b,int rod){
  87.     if(mapa[rod][c].size()==0)return 0;
  88.     int p1=0,k1=mapa[rod][c].size();
  89.     int i1=-1,i2=-1;
  90.     while(p1<=k1){
  91.         int s1=(p1+k1)/2;
  92.         if(mapa[rod][c][s1]>=a){
  93.             k1=s1-1;
  94.             i1=mapa[rod][c][s1];
  95.         }
  96.         else p1=s1+1;
  97.     }
  98.     p1=0;k1=mapa[rod][c].size();
  99.     while(p1<=k1){
  100.         int s1=(p1+k1)/2;
  101.         if(mapa[rod][c][s1]<=b){
  102.             p1=s1+1;
  103.             i2=mapa[rod][c][s1];
  104.         }
  105.         else k1=s1-1;
  106.     }
  107.     if(i1==i2&&i1!=-1)return 1;
  108.     if(a<=i1&&i1<=b)return 1;
  109.     if(a<=i2&&i2<=b)return 1;
  110.     return 0;
  111. }
  112. inline void lcah(int a,int b){
  113.     bool ok=0;
  114.     int wierz=lca(a,b);
  115.     int rodzaj=galaz[wierz];
  116.     while(galaz[a]!=galaz[b]){
  117.         if(gleb[gora[galaz[a]]]<gleb[gora[galaz[b]]])swap(a,b);
  118.         //obliczam dla dla galezi
  119.         if(galaz[a]!=rodzaj){
  120.             if(szukaj(1,ind[a],galaz[a])==1)ok=1;
  121.         }
  122.         if(galaz[b]!=rodzaj){
  123.             if(szukaj(1,ind[b],galaz[b])==1)ok=1;
  124.         }
  125.         a=ojciec[gora[galaz[a]]];//skaczemy do nastepnej sciezki
  126.     }
  127.     if(gleb[a]>gleb[b])swap(a,b);
  128.     if(szukaj(ind[a],ind[b],rodzaj)==1)ok=1;
  129.     //obliczam dla fragmentu sciezki od a do b
  130.     if(ok==1)cout<<"Find"<<'\n';
  131.     else cout<<"NotFind"<<'\n';
  132. }
  133. inline void dfs1(int v){
  134.     odw[v]=1;
  135.     mapa[galaz[v]][war[v]].pb(ind[v]);
  136.     mapet[galaz[v]].pb(war[v]);
  137.     for(int i=0;i<tab[v].size();i++){
  138.         int u=tab[v][i];
  139.         if(!odw[u]){
  140.             dfs1(u);
  141.         }
  142.     }
  143. }
  144. void czysc(){
  145.     for(int i=0;i<=n;i++)odw[i]=0;
  146. }
  147. int main(){
  148.     ios_base::sync_with_stdio(0);
  149.     cin.tie(0);
  150.     cout.tie(0);
  151.     while(cin>>n>>m){
  152.         mapa.clear();
  153.         czysc();
  154.         for(int i=0;i<=n;i++)nastepny[i]=-1,mapet[i].clear(),tab[i].clear(),galaz[i]=0,gleb[i]=0,gora[i]=0,we[i]=0,wy[i]=0,ind[i]=0,rozmiar[i]=0;
  155.         ia=0;ktora=1;ilosc=0;
  156.         for(int i=1;i<=n;i++){
  157.             cin>>war[i];
  158.         }
  159.         for(int i=0;i<n-1;i++){
  160.             cin>>a>>b;
  161.             tab[a].pb(b);
  162.             tab[b].pb(a);
  163.         }
  164.         dfs(1);ind[1]=1;czysc();
  165.         hld(1);czysc();
  166.         dfs2(1);czysc();
  167.         dfs1(1);ojc[1][0]=1;
  168.         for(int j=1;j<=18;j++){
  169.             for(int i=1;i<=n;i++){
  170.                 ojc[i][j]=ojc[ojc[i][j-1]][j-1];
  171.             }
  172.         }
  173.         for(int i=1;i<=ktora;i++){
  174.             sort(mapet[i].begin(),mapet[i].end());
  175.             for(int j=0;j<mapet[i].size();j++){
  176.                 int u=mapet[i][j];
  177.                 sort(mapa[i][u].begin(),mapa[i][u].end());
  178.             }
  179.         }
  180.         for(int i=0;i<m;i++){
  181.             cin>>a>>b>>c;
  182.             lcah(a,b);
  183.         }
  184.         cout<<endl;
  185.     }
  186.     return 0;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement