#include#include#include#include#includeusingnamespacestd;co" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[Wc2006]水管局長數(shù)據(jù)加強版 LCA&RMQ

系統(tǒng) 2112 0

參考論文:? 郭華陽《RMQ與LCA問題》 的解法.

通過構(gòu)建最小生成樹,然后轉(zhuǎn)換成 尋找最近公共祖先來求解, 逆序處理詢問,將刪除改成添加邊.

代碼在BZOJ上WA了.暫時未找到原因, 先放著... 不過有看到用splay, 動態(tài)樹等做的..

        #include<cstdio>
        
          

#include
        
        <cstdlib>
        
          

#include
        
        <cstring>
        
          

#include
        
        <algorithm>
        
          

#include
        
        <map>
        
          

#include
        
        <vector>


        
          using
        
        
          namespace
        
        
           std;


        
        
          const
        
        
          int
        
         N = (
        
          int
        
        )1e5+
        
          10
        
        
          ;


        
        
          const
        
        
          int
        
         M = (
        
          int
        
        )1e6+
        
          10
        
        
          ;


        
        
          const
        
        
          int
        
         maxn = 
        
          5
        
        *
        
          N;


        
        
          int
        
        
           n, m, Q_num;


        
        
          struct
        
        
           node{

    
        
        
          int
        
        
           a, b, t;

    
        
        
          bool
        
        
          operator
        
         < (
        
          const
        
         node &tmp) 
        
          const
        
        
          {

        
        
        
          return
        
         t <
        
           tmp.t;

    }

}edge[M];


        
        
          struct
        
        
           Query{

    
        
        
          int
        
        
           k,a,b;

}Q[N];



map
        
        < pair<
        
          int
        
        ,
        
          int
        
        >, 
        
          int
        
         >
        
           mp;

vector
        
        <
        
          int
        
        > S[
        
          2
        
        *N+
        
          10
        
        
          ];




        
        
          int
        
        
           getint(){

    
        
        
          char
        
         ch =
        
           getchar();

    
        
        
          for
        
        (; ch > 
        
          '
        
        
          9
        
        
          '
        
         || ch < 
        
          '
        
        
          0
        
        
          '
        
        ; ch =
        
           getchar() );

    
        
        
          int
        
         tmp = 
        
          0
        
        
          ;

    
        
        
          for
        
        (; ch > 
        
          '
        
        
          0
        
        
          '
        
         && ch < 
        
          '
        
        
          9
        
        
          '
        
        ; ch =
        
           getchar() )

        tmp 
        
        = tmp*
        
          10
        
         + ch - 
        
          '
        
        
          0
        
        
          '
        
        
          ;

    
        
        
          return
        
        
           tmp;

}




        
        
          int
        
        
           st[maxn], top;


        
        
          bool
        
        
           vis[M];




        
        
          int
        
         find(
        
          int
        
        
           x){

    
        
        
          return
        
         st[x] == x ?
        
           x : find(st[x]);

}




        
        
          void
        
        
           debug(){

    printf(
        
        
          "
        
        
          n = %d, m = %d, Q_num = %d\n
        
        
          "
        
        
          , n, m, Q_num );

    printf(
        
        
          "
        
        
          Edge:\n
        
        
          "
        
        
          );

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < m; i++
        
          )

        printf(
        
        
          "
        
        
          (%d,%d,t=%d)\n
        
        
          "
        
        
          , edge[i].a, edge[i].b, edge[i].t );

    printf(
        
        
          "
        
        
          Query:\n
        
        
          "
        
        
          );

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < Q_num; i++
        
          )

        printf(
        
        
          "
        
        
          k=%d,(%d,%d)\n
        
        
          "
        
        
          , Q[i].k, Q[i].a, Q[i].b );



}


        
        
          void
        
        
           input(){

    n 
        
        = getint(); m = getint(); Q_num =
        
           getint();

        

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < m; i++){ 
        
          //
        
        
           Edge infomation
        
        

        edge[i].a =
        
           getint();

        edge[i].b 
        
        =
        
           getint();

        edge[i].t 
        
        =
        
           getint();

    }

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < Q_num; i++){ 
        
          //
        
        
           Query 
        
        

        Q[i].k =
        
           getint();

        Q[i].a 
        
        =
        
           getint();

        Q[i].b 
        
        =
        
           getint();

    }

    sort( edge, edge
        
        +m ); 
        
          //
        
        
           sort by t desc
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < m; i++) 
        
          //
        
        
           index
        
        

        mp[ make_pair( edge[i].a, edge[i].b ) ] =
        
           

            mp[ make_pair( edge[i].b, edge[i].a ) ] 
        
        =
        
           i;

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < Q_num; i++
        
          ){

        
        
        
          if
        
        ( Q[i].k == 
        
          2
        
        
           )    

            vis[ mp[make_pair(Q[i].a, Q[i].b)] ] 
        
        = 
        
          true
        
        
          ;    

    }    


        
        
          //
        
        
              for(int i = 0; i < m; i++)


        
        
          //
        
        
                  printf("%d ", vis[i] ); puts("");
        
        
          }




        
        
          int
        
        
           val[maxn];


        
        
          int
        
        
           pos[maxn], dep[maxn], vec[maxn], idx;


        
        
          int
        
         dp[maxn][
        
          50
        
        
          ];




        
        
          void
        
         dfs(
        
          int
        
         u,
        
          int
        
        
           d){

    dep[
        
        ++idx] = d; vec[idx] =
        
           u;    

    
        
        
          if
        
        ( pos[u] == -
        
          1
        
         ) pos[u] =
        
           idx;

    dep[idx] 
        
        =
        
           d;

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < (
        
          int
        
        )S[u].size(); i++
        
          ){

        dfs( S[u][i], d
        
        +
        
          1
        
        
           );    

        dep[
        
        ++idx] = d;    vec[idx] =
        
           u;    

    }

}




        
        
          void
        
        
           print(){

    printf(
        
        
          "
        
        
          Top = %d\n
        
        
          "
        
        
          , top);

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          1
        
        ; i <= top; i++) printf(
        
          "
        
        
          pos[%d] = %d, val[%d] = %d\n
        
        
          "
        
        
          , i, pos[i], i, val[i]);



    printf(
        
        
          "
        
        
          idx = %d\n
        
        
          "
        
        
          , idx);

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          1
        
        ; i <= idx; i++
        
          )

        printf(
        
        
          "
        
        
          i = %d, vec[%d] = %d, dep[%d] = %d\n
        
        
          "
        
        
          , i, i, vec[i], i, dep[i] );    



}


        
        
          void
        
        
           predeal(){

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < 
        
          2
        
        *n+
        
          10
        
        ; i++
        
          )

        st[i] 
        
        =
        
           i, S[i].clear();    

    top 
        
        =
        
           n;

    
        
        
          for
        
        (
        
          int
        
         i = 
        
          0
        
        ; i < m; i++
        
          ){

        
        
        
          if
        
        ( vis[ mp[ make_pair( edge[i].a, edge[i].b )  ] ] == 
        
          false
        
        
           ){

            
        
        
          int
        
         a = edge[i].a, b = edge[i].b, t =
        
           edge[i].t;

            
        
        
          int
        
         x = find(a), y =
        
           find(b);    

        
        
        
          //
        
        
              printf("(%d,%d): x = %d, y = %d\n",a,b, x, y );    
        
        
          if
        
        ( x !=
        
           y ){

                st[x] 
        
        = st[y] = ++
        
          top;

                val[top] 
        
        =
        
           t;

                S[top].push_back(x), S[top].push_back(y);    

            }

        }    

    }



    
        
        
          for
        
        (
        
          int
        
         i = 
        
          1
        
        ; i <= top; i++
        
          ) 

        pos[i] 
        
        = -
        
          1
        
        
          ; 

    idx 
        
        = 
        
          0
        
        
          ;

    dfs( top, 
        
        
          0
        
        
           );    



    
        
        
          //
        
        
          print();

    
        
        
          //
        
        
           init RMQ
        
        
          for
        
        (
        
          int
        
         i = 
        
          1
        
        ; i <= idx; i++
        
          )

        dp[i][
        
        
          0
        
        ] =
        
           i;

    
        
        
          for
        
        (
        
          int
        
         j = 
        
          1
        
        ; (
        
          1
        
        <<j) <= idx; j++
        
          ){

        
        
        
          for
        
        (
        
          int
        
         i = 
        
          1
        
        ; i+(
        
          1
        
        <<j)-
        
          1
        
         <= idx; i++
        
          ){

            
        
        
          //
        
        
           dp[i][j] = min( dp[i][j-1], dp[i+(1<<(j-1))][j-1] );
        
        
          if
        
        ( dep[ dp[i][j-
        
          1
        
        ] ] < dep[ dp[i+(
        
          1
        
        <<(j-
        
          1
        
        ))][j-
        
          1
        
        
          ] ] )

                dp[i][j] 
        
        = dp[i][j-
        
          1
        
        
          ];

            
        
        
          else
        
         dp[i][j] = dp[i+(
        
          1
        
        <<(j-
        
          1
        
        ))][j-
        
          1
        
        
          ];

        }    

    }

}


        
        
          int
        
         RMQ_find(
        
          int
        
         l,
        
          int
        
        
           r){

    
        
        
          int
        
         d = r-l+
        
          1
        
        , k = 
        
          0
        
        
          ;

    
        
        
          while
        
        ( (
        
          1
        
        <<(k+
        
          1
        
        )) < d ) k++
        
          ;


        
        
          //
        
        
              printf("RMQ: k = %d\n", k );


        
        
          //
        
        
              printf("RMQ: L = %d, R = %d\n", dp[l][k] , dp[r-(1<<k)+1][k] );
        
        
          if
        
        ( dep[ dp[l][k] ] < dep[ dp[r-(
        
          1
        
        <<k)+
        
          1
        
        ][k] ] ) 
        
          return
        
        
           dp[l][k];

    
        
        
          return
        
         dp[ r-(
        
          1
        
        <<k)+
        
          1
        
        
           ][k];

}




        
        
          int
        
        
           ans[M], ans_cnt;




        
        
          void
        
        
           solve(){

    
        
        
          int
        
         ans_cnt = 
        
          0
        
        
          ;

    predeal();

    
        
        
          for
        
        (
        
          int
        
         i = Q_num-
        
          1
        
        ; i >= 
        
          0
        
        ; i--
        
           ){ 

        
        
        
          if
        
        ( Q[i].k == 
        
          1
        
        
           ){

            
        
        
          int
        
         l = pos[ Q[i].a ], r =
        
           pos[ Q[i].b ];

        
        
        
          //
        
        
              printf("(a=%d,b=%d),(l=%d,r=%d)\n", Q[i].a, Q[i].b, l, r);    
        
        
          if
        
        ( l >
        
           r ) swap( l, r );

            
        
        
          int
        
         pt = RMQ_find(l,r);  
        
          //
        
        
          printf("pt = %d\n", pt );    
        
        

            ans[ ans_cnt++ ] =
        
           val[ vec[pt] ];

        }

        
        
        
          else
        
        
          {

            
        
        
          //
        
        
           Q[i].k == 2 
        
        

            vis[ mp[ make_pair( Q[i].a,Q[i].b ) ] ] = 
        
          false
        
        
          ;

            predeal(); 
        
        
          //
        
        
           restructrue the min genaration tree
        
        
                  }

    
        
        
          //
        
        
              puts("******************************************************");    
        
        
              }

    
        
        
          for
        
        (
        
          int
        
         i = ans_cnt-
        
          1
        
        ; i >= 
        
          0
        
        ; i--
        
           ){

        printf(
        
        
          "
        
        
          %d\n
        
        
          "
        
        
          , ans[i] );    

    }

}




        
        
          int
        
        
           main(){

    freopen(
        
        
          "
        
        
          1.in
        
        
          "
        
        ,
        
          "
        
        
          r
        
        
          "
        
        
          ,stdin);



    input();

    solve();



    
        
        
          return
        
        
          0
        
        
          ;

}
        
      
View Code

?

[Wc2006]水管局長數(shù)據(jù)加強版 LCA&RMQ


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美一级欧美三级 | 波多野结衣三区 | 99精品国产第一福利网站 | 亚洲精品久久九九精品 | 99精品国产三级在线观看 | 欧美猛交xxxxx | 久久伊人中文字幕 | 国产在线综合网 | 91久久国产青草亚洲 | 99热8| 久久精品国产一区二区三区日韩 | 久久久精品2018免费观看 | 久久天天丁香婷婷中文字幕 | 精品久久网 | 久久精品伦理 | 一级一级18女人毛片 | 久久综合一区 | 97影院理论 | 国产精品天天操 | 日韩黄色片 | 四虎成人欧美精品在永久在线 | 国产成人三级 | 日日操免费视频 | 色拍自拍亚洲综合在线 | 国产成年网站 | 高清视频在线播放 | 亚洲欧美高清视频 | 激情一区二区三区成人 | 手机看片国产福利 | 欧美综合一区 | 亚洲精品丝袜在线一区波多野结衣 | 欧美成人手机在线视频 | 精品久久久久久久99热 | 亚洲成a人片77777kkk | 中文字幕久久网 | 欧美一区二区影院 | 精品视频在线免费播放 | 国产成人a在一区线观看高清 | 91精品国产免费久久国语麻豆 | 日本高清中文字幕视频在线 | 免费精品国产 |