Subject to the effect
slightly.
analysis
Based on the maximum value of each node is the root node topology nodes, topology need to deduct child about the number of nodes that do not meet the new topology of the binary tree search Merge when, after the merger need to be updated about the children from the topology of the new topology the number of nodes on the grounds that they may later be accessed. (If the point is to update the rigor of an edge, but only about a child node used to get it)
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 the TreeNode { 140 int LCH = 0 , Rch = 0 , Val = 0 ; 141 is }; 142 143 int N, the root, ANS ; 144 the TreeNode Tree [maxN]; 145 146 // find the binary tree rooted at rt rightmost k is larger than a first node 147 //If you have been to traverse a node does not belong to rt rooted topology returns 0, indicating that the topology to rt as the root of all nodes into the topology of its parent node 148 int getMax ( int rt, int k) { 149 IF (RT!) return 0 ; 150 the while (Tree [RT] && .rch Tree [RT] .rch <K && RT <Tree [RT] .rch) RT = Tree [RT] .rch; 151 IF ( rt <Tree [rt] .rch) return Tree [rt] .rch; 152 return 0 ; 153 } 154 155 // find the first k is smaller than the root node of the binary tree rt leftmost 156 int getMin ( int RT, int K) { 157 if(!rt) return 0; 158 while(tree[rt].lch && tree[rt].lch > k && tree[rt].lch < rt) rt = tree[rt].lch; 159 if(tree[rt].lch < rt) return tree[rt].lch; 160 return 0; 161 } 162 163 void dfs(int rt) { 164 if(!rt) return; 165 tree[rt].val = 1; 166 167 dfs(tree[rt].lch); 168 dfs(tree[rt].rch); 169 170 int mostRight = getMax (Tree [RT] .lch, RT); 171 is int mostLeft = getMin (Tree [RT] .rch, RT); 172 173 IF (Tree [RT] && .lch Tree [RT] .lch < RT ) { 174 Tree [RT] .val + = Tree [Tree [RT] .lch] .val; 175 IF (mostRight) { 176 Tree [RT] .val - = Tree [mostRight] .val; 177 Tree [Tree [ RT] .lch] .val - = Tree [mostRight] .val; // later left the child may also have access to, so you want to update, will not have access to the other nodes 178 } 179 } 180 IF (Tree [RT] .rch Tree && [RT] .rch> RT) { 181 Tree [RT] .val + = Tree [Tree [RT] .rch] .val; 182 IF (mostLeft) { 183 is Tree [RT] .val - = Tree [mostLeft] .val; 184 Tree [Tree [RT] .rch] .val - = Tree [mostLeft] .val; // may also have access to the right after the child, so you want to update, other nodes will not have access to the 185 } 186 } 187 188 ANS = max (ANS, Tree [RT ] .val); 189 } 190 191 int main () { 192 // The freopen ( "MyOutput.txt", "W", stdout); 193 // The freopen ( "input.txt", "R & lt", stdin); 194 //INIT(); 195 scanf("%d%d", &N, &root); 196 Rep(i, N) { 197 int fa, lch, rch; 198 scanf("%d%d%d", &fa, &lch, &rch); 199 200 tree[fa].lch = lch; 201 tree[fa].rch = rch; 202 } 203 204 dfs(root); 205 206 printf("%d\n", ans); 207 return 0; 208 }