zoukankan      html  css  js  c++  java
  • 牛客 在二叉树中找到两个节点的最近公共祖先(再进阶)

    题目链接:https://www.nowcoder.com/practice/66a813f33f1e499e816ddca216aa1983?tpId=101&tqId=33246&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

    题目大意

      略。

    分析

      ST 表的时间复杂度是 O(N*logN + M),而此题所用的 dfs + 并查集的复杂度为 O(N + M),然而最终耗时并没有 ST 快,着实令人费解。
      此题的详解可参看左神的书。

    代码如下

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3  
      4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i)
      6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i)
      7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i)
      8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
      9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
     10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
     11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
     12  
     13 #define pr(x) cout << #x << " = " << x << "  "
     14 #define prln(x) cout << #x << " = " << x << endl
     15  
     16 #define LOWBIT(x) ((x)&(-x))
     17  
     18 #define ALL(x) x.begin(),x.end()
     19 #define INS(x) inserter(x,x.begin())
     20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
     21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 
     22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
     23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
     24  
     25 #define ms0(a) memset(a,0,sizeof(a))
     26 #define msI(a) memset(a,0x3f,sizeof(a))
     27 #define msM(a) memset(a,-1,sizeof(a))
     28 
     29 #define MP make_pair
     30 #define PB push_back
     31 #define ft first
     32 #define sd second
     33  
     34 template<typename T1, typename T2>
     35 istream &operator>>(istream &in, pair<T1, T2> &p) {
     36     in >> p.first >> p.second;
     37     return in;
     38 }
     39  
     40 template<typename T>
     41 istream &operator>>(istream &in, vector<T> &v) {
     42     for (auto &x: v)
     43         in >> x;
     44     return in;
     45 }
     46 
     47 template<typename T>
     48 ostream &operator<<(ostream &out, vector<T> &v) {
     49     Rep(i, v.size()) out << v[i] << " 
    "[i == v.size() - 1];
     50     return out;
     51 }
     52  
     53 template<typename T1, typename T2>
     54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
     55     out << "[" << p.first << ", " << p.second << "]" << "
    ";
     56     return out;
     57 }
     58 
     59 inline int gc(){
     60     static const int BUF = 1e7;
     61     static char buf[BUF], *bg = buf + BUF, *ed = bg;
     62     
     63     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
     64     return *bg++;
     65 } 
     66 
     67 inline int ri(){
     68     int x = 0, f = 1, c = gc();
     69     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
     70     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
     71     return x*f;
     72 }
     73 
     74 template<class T>
     75 inline string toString(T x) {
     76     ostringstream sout;
     77     sout << x;
     78     return sout.str();
     79 }
     80 
     81 inline int toInt(string s) {
     82     int v;
     83     istringstream sin(s);
     84     sin >> v;
     85     return v;
     86 }
     87 
     88 //min <= aim <= max
     89 template<typename T>
     90 inline bool BETWEEN(const T aim, const T min, const T max) {
     91     return min <= aim && aim <= max;
     92 }
     93 
     94 typedef unsigned int uI;
     95 typedef long long LL;
     96 typedef unsigned long long uLL;
     97 typedef vector< int > VI;
     98 typedef vector< bool > VB;
     99 typedef vector< char > VC;
    100 typedef vector< double > VD;
    101 typedef vector< string > VS;
    102 typedef vector< LL > VL;
    103 typedef vector< VI > VVI;
    104 typedef vector< VB > VVB;
    105 typedef vector< VS > VVS;
    106 typedef vector< VL > VVL;
    107 typedef vector< VVI > VVVI;
    108 typedef vector< VVL > VVVL;
    109 typedef pair< int, int > PII;
    110 typedef pair< LL, LL > PLL;
    111 typedef pair< int, string > PIS;
    112 typedef pair< string, int > PSI;
    113 typedef pair< string, string > PSS;
    114 typedef pair< double, double > PDD;
    115 typedef vector< PII > VPII;
    116 typedef vector< PLL > VPLL;
    117 typedef vector< VPII > VVPII;
    118 typedef vector< VPLL > VVPLL;
    119 typedef vector< VS > VVS;
    120 typedef map< int, int > MII;
    121 typedef unordered_map< int, int > uMII;
    122 typedef map< LL, LL > MLL;
    123 typedef map< string, int > MSI;
    124 typedef map< int, string > MIS;
    125 typedef set< int > SI;
    126 typedef stack< int > SKI;
    127 typedef deque< int > DQI;
    128 typedef queue< int > QI;
    129 typedef priority_queue< int > PQIMax;
    130 typedef priority_queue< int, VI, greater< int > > PQIMin;
    131 const double EPS = 1e-8;
    132 const LL inf = 0x7fffffff;
    133 const LL infLL = 0x7fffffffffffffffLL;
    134 const LL mod = 1e9 + 7;
    135 const int maxN = 1e5 + 7;
    136 const LL ONE = 1;
    137 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
    138 const LL oddBits = 0x5555555555555555;
    139 
    140 struct TreeNode {
    141     int lch = 0, rch = 0, val = 0, fa = 0, level = 0;
    142 };
    143 
    144 int N, M, root, o1, o2, ans[maxN];
    145 TreeNode tree[maxN];
    146 
    147 unordered_map< int, VI > queryMap; // key 为节点号,value 为询问中与key有关的其他节点号 
    148 unordered_map< int, VI > posMap; // key 为节点号,value 为询问中与key有关答案填写位置 
    149 
    150 int dsu[maxN];
    151 
    152 inline int Find(int x) {
    153     while (x != dsu[x]) x = dsu[x] = dsu[dsu[x]];
    154     return x;
    155 } 
    156 
    157 inline void Union(int x, int y){
    158     dsu[y] = x;
    159 }
    160 
    161 inline void dfs(int rt) {
    162     dsu[rt] = rt;
    163     
    164     if(queryMap.find(rt) != queryMap.end()) {
    165         VI &VQ = queryMap[rt], &VP = posMap[rt];
    166         
    167         Rep(i, VQ.size()) {
    168             if(dsu[VQ[i]]) {
    169                 ans[VP[i]] = Find(VQ[i]);
    170             }
    171         }
    172         
    173         queryMap.erase(rt);
    174         posMap.erase(rt);
    175     }
    176     
    177     if(tree[rt].lch) {
    178         dfs(tree[rt].lch);
    179         Union(rt, tree[rt].lch);
    180     }
    181     
    182     if(tree[rt].rch) {
    183         dfs(tree[rt].rch);
    184         Union(rt, tree[rt].rch);
    185     }
    186 }
    187 
    188 int main(){
    189     //freopen("MyOutput.txt","w",stdout);
    190     //freopen("input.txt","r",stdin);
    191     //INIT();
    192     scanf("%d%d", &N, &root);
    193     Rep(i, N) {
    194         int fa, lch, rch;
    195         scanf("%d%d%d", &fa, &lch, &rch);
    196         
    197         tree[fa].lch = lch;
    198         tree[fa].rch = rch;
    199     }
    200     
    201     scanf("%d", &M);
    202     Rep(i, M) {
    203         scanf("%d%d", &o1, &o2);
    204         queryMap[o1].PB(o2);
    205         queryMap[o2].PB(o1);
    206         posMap[o1].PB(i);
    207         posMap[o2].PB(i);
    208     }
    209     dfs(root);
    210     
    211     Rep(i, M) printf("%d
    ", ans[i]);
    212     return 0;
    213 }
    View Code
  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11368314.html
Copyright © 2011-2022 走看看