Topic links: https://vjudge.net/problem/UVA-548
Subject to the effect
A plurality of sets of data, a binary input data sequence and in each subsequent traversal, you output a leaf node number, the value of the sum of all the leaf nodes on the path to the root node number through which the minimum, the minimum number and the leaves are that. Numbers are not heavy.
analysis
Tree structure foundation problems, but we all know, UVA input output compare metamorphosis.
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 < (n); ++i) 6 #define For(i,s,t) for (int i = (s); i <= (t); ++i) 7 #define rFor(i,t,s) for (int i = (t); i >= (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 21 #define ms0(a) memset(a,0,sizeof(a)) 22 #define msI(a) memset(a,inf,sizeof(a)) 23 #define msM(a) memset(a,-1,sizeof(a)) 24 25 #define MP make_pair 26 #define PB push_back 27 #define ft first 28 #define sd second 29 30 template<typename T1, typename T2> 31 istream &operator>>(istream &in, pair<T1, T2> &p) { 32 in >> p.first >> p.second; 33 return in; 34 } 35 36 template<typename T> 37 istream &operator>>(istream &in, vector<T> &v) { 38 for (auto &x: v) 39 in >> x; 40 return in; 41 } 42 43 template<typename T1, typename T2> 44 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) { 45 out << "[" << p.first << ", " << p.second << "]" << "\n"; 46 return out; 47 } 48 49 inline int gc(){ 50 static const int BUF = 1e7; 51 static char buf[BUF], *bg = buf + BUF, *ed = bg; 52 53 if(bg == ed) fread(bg = buf, 1, BUF, stdin); 54 return *bg++; 55 } 56 57 inline int ri(){ 58 int x = 0, f = 1, c = gc(); 59 for(; c<48||c>57; f = c=='-'?-1:f, c=gc()); 60 for(; c>47&&c<58; x = x*10 + c - 48, c=gc()); 61 return x*f; 62 } 63 64 typedef long long LL; 65 typedef unsigned long long uLL; 66 typedef pair< double, double > PDD; 67 typedef pair< int, int > PII; 68 typedef pair< int, PII > PIPII; 69 typedef pair< string, int > PSI; 70 typedef pair< int, PSI > PIPSI; 71 typedef set< int > SI; 72 typedef vector< int > VI; 73 typedef vector< VI > VVI; 74 typedef vector< PII > VPII; 75 typedef map< int, int > MII; 76 typedef map< int, PII > MIPII; 77 typedef map< string, int > MSI; 78 typedef multimap< int, int > MMII; 79 typedef unordered_map< int, int > uMII; 80 typedef pair< LL, LL > PLL; 81 typedef vector< LL > VL; 82 typedef vector< VL > VVL; 83 typedef priority_queue< int > PQIMax; 84 typedef priority_queue< int, VI, greater< int > > PQIMin; 85 const double EPS = 1e-10; 86 const LL inf = 0x7fffffff; 87 const LL infLL = 0x7fffffffffffffffLL; 88 const LL mod = 1e9 + 7; 89 const int maxN = 1e4 + 7; 90 const LL ONE = 1; 91 const LL evenBits = 0xaaaaaaaaaaaaaaaa; 92 const LL oddBits = 0x5555555555555555; 93 94 struct Node{ 95 int l, r; 96 int w; 97 }; 98 99 int inorder[maxN], postorder[maxN]; 100 int sz; 101 string line; 102 103 Node tree[maxN]; 104 int tlen; 105 106 int ansSum, ans; 107 108 void build(int in, int post, int len, int rt) { 109 if(len <= 0) return; 110 tree[rt].w = postorder[post + len - 1]; 111 tree[rt].l = tree[rt].r = 0; 112 113 int tmp = find(inorder, inorder + sz, tree[rt].w) - &inorder[in]; 114 if(tmp > 0) { 115 tree[rt].l = ++tlen; 116 build(in, post, tmp, tlen); 117 } 118 if(len - tmp - 1 > 0) { 119 tree[rt].r = ++tlen; 120 build(in + tmp + 1, post + tmp, len - tmp - 1, tlen); 121 } 122 } 123 124 bool isLeaf(int rt) { 125 return tree[rt].l == 0 && tree[rt].r == 0; 126 } 127 128 void solve(int rt, int ret) { 129 ret += tree[rt].w; 130 if(isLeaf(rt)) { 131 if(ansSum == ret) { 132 if(ans > ret) ans = tree[rt].w; 133 } 134 else if(ansSum > ret) { 135 ansSum = ret; 136 ans = tree[rt].w; 137 } 138 } 139 else { 140 if(tree[rt].l) solve(tree[rt].l, ret); 141 if(tree[rt].r) solve(tree[rt].r, ret); 142 } 143 } 144 145 146 int main(){ 147 //freopen("MyOutput.txt","w",stdout); 148 INIT(); 149 while(getline(cin, line)) { 150 ms0(tree); 151 tlen = sz = 0; 152 ansSum = ans = inf; 153 stringstream ss(line); 154 int x; 155 while(ss >> x) inorder[sz++] = x; 156 157 sz = 0; 158 getline(cin, line); 159 ss.clear(); 160 ss.str(line); 161 while(ss >> x) postorder[sz++] = x; 162 163 build(0, 0, sz, ++tlen); 164 solve(1, 0); 165 cout << ans << endl; 166 } 167 return 0; 168 }