Bovine off to find the specified value accumulated in the binary tree and the longest path length

Topic links: https://www.nowcoder.com/practice/2d35bc3364e3470381bc4eebd9178747?tpId=101&tqId=33233&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question -ranking

Subject to the effect

  slightly.

analysis

  If a tree chain (from the root to the end of a node), if it is a strand accumulation and the suffix tree is k, the whole tree, and the chain is accumulated sum, then the first half of the tree and the chain will be for the accumulated sum - k , so long as the depth-first traversal of the tree, and records accumulated, and the accumulated sum to see the current node to the recording - k if occurred (record with a hash table).

code show as below

  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] << " \n"[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 << "]" << "\n";
 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<classT>
 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 in;
83      istringstream son (s);
84      son >> in;
85      return to;
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 long long LL;
 95 typedef unsigned long long uLL;
 96 typedef vector< int > VI;
 97 typedef vector< bool > VB;
 98 typedef vector< char > VC;
 99 typedef vector< double > VD;
100 typedef vector< string > VS;
101 typedef vector< LL > VL;
102 typedef vector< VI > VVI;
103 typedef vector< VB > VVB;
104 typedef vector< VS > VVS;
105 typedef vector< VL > VVL;
106 typedef vector< VVI > VVVI;
107 typedef vector< VVL > VVVL;
108 typedef pair< int, int > PII;
109 typedef pair< LL, LL > PLL;
110 typedef pair< int, string > PIS;
111 typedef pair< string, int > PSI;
112 typedef pair< string, string > PSS;
113 typedef pair< double, double > PDD;
114 typedef vector< PII > VPII;
115 typedef vector< PLL > VPLL;
116 typedef vector< VPII > VVPII;
117 typedef vector< VPLL > VVPLL;
118 typedef vector< VS > VVS;
119 typedef map< int, int > MII;
120 typedef unordered_map< int, int > uMII;
121 typedef map< LL, LL > MLL;
122 typedef map< string, int > MSI;
123 typedef map< int, string > MIS;
124 typedef set< int > SI;
125 typedef stack< int > SKI;
126 typedef deque< int > DQI;
127 typedef queue< int > QI;
128 typedef priority_queue< int > PQIMax;
129 typedef priority_queue< int, VI, greater< int > > PQIMin;
130 const double EPS = 1e-8;
131 const LL inf = 0x7fffffff;
132 const LL infLL = 0x7fffffffffffffffLL;
133 const LL mod = 1e9 + 7;
134 const int maxN = 2e5 + 7;
135 const LL ONE = 1;
136 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
137 const LL oddBits = 0x5555555555555555;
138 
139 struct TreeNode {
140     int lch = 0, rch = 0, val;
141 };
142 
143 int N, root, k, ans;
144 TreeNode tree[maxN];
145 uMII um;
146 
147 void preOrder(int rt, int h, int sum) {
148     if(um.find(sum - k) != um.end()) ans = max(ans, h - um[sum - k]);
149     if(um.find(sum) == um.end()) um[sum] = h;
150     
151     if(tree[rt].lch) preOrder(tree[rt].lch, h + 1, sum + tree[tree[rt].lch].val);
152     if(tree[rt].rch) preOrder(tree[rt].rch, h + 1, sum + tree[tree[rt].rch].val);
153     
154     if(um[sum] == h) um.erase(sum);
155 }
156 
157 int main(){
158     //freopen("MyOutput.txt","w",stdout);
159     //freopen("input.txt","r",stdin);
160     //INIT();
161     scanf("%d%d", &N, &root);
162     Rep(i, N) {
163         int fa, lch, rch, val;
164         scanf("%d%d%d%d", &fa, &lch, &rch, &val);
165         
166         tree[fa].lch = lch;
167         tree[fa].rch = rch;
168         tree[fa].val = val;
169     }
170     scanf("%d", &k);
171     
172     um[0] = 0;
173     preOrder(root, 1, tree[root].val);
174     printf("%d\n", ans);
175     return 0;
176 }
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/11357913.html