UVA 548 Tree

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 }
View Code

 

Guess you like

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