Advertisement
Guest User

Untitled

a guest
Feb 27th, 2015
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <algorithm>
  4. #include <string>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. int maxHalf = 0;
  10. bool beOrNotToBe = 1;
  11. std::ofstream ofs("tst.out");
  12. struct Node{
  13.     int v;
  14.     Node *l, *r;
  15.     int h, k, lc, ans;
  16.     bool isL, isR, pr;
  17.     Node (int n ){ v = n; l = r = 0; ans = lc = h = k = 0; pr=true;isL = isR = 0;}
  18.     string toString(){
  19.         return std::to_string(v) + " h=" +std::to_string(h) + " versh=" + std::to_string(k)
  20.             + " isL=" + std::to_string(isL) + " isR=" + std::to_string(isR)
  21.             + " lc=" + std::to_string(lc) + " ans=" + std::to_string(ans);
  22.     }
  23. };
  24. Node * root;
  25. set<Node*> nodeSet;
  26.  
  27. void insert(Node * t, int n){
  28.     if (t == 0)
  29.     {
  30.         t = new Node(n);
  31.     }
  32.     else
  33.     {
  34.         if (n < t->v)
  35.         {
  36.             if (t->l)
  37.                 insert(t->l, n);
  38.             else
  39.                 t->l = new Node(n);
  40.         }
  41.         else
  42.         if (n > t->v)
  43.         {
  44.             if (t->r)
  45.                 insert(t->r, n);
  46.             else
  47.                 t->r = new Node(n);
  48.         }
  49.     }
  50. }
  51.  
  52. void print(Node * t){
  53.     if (t != 0){
  54.        
  55.         if (t->pr) ofs << t->v << std::endl;
  56.         //std::cout << t->toString() << std::endl;
  57.         print(t->l);
  58.         print(t->r);
  59.     }
  60. }
  61.  
  62. void traverse(Node * t){
  63.     if (t != 0){
  64.         if (t->l) traverse(t->l);
  65.         if (t->r) traverse(t->r);
  66.         if (t->l==0 && t->r==0) {t->h = 0;}
  67.         if (t->l    && !t->r) {t->h = t->l->h + 1; t->isL = 1;}
  68.         if (!t->l   &&  t->r) {t->h = t->r->h + 1; t->isR = 1;}
  69.         if (t->l    &&  t->r) {
  70.             t->h = std::max(t->l->h, t->r->h) + 1;
  71.             t->k = t->l->h + t->r->h + 2;
  72.             if (t->k >  maxHalf) {maxHalf = t->k; nodeSet.clear();}
  73.             if (t->k == maxHalf) {nodeSet.insert(t);}
  74.             if (t->l->h >   t->r->h) {t->isL = 1;}
  75.             if (t->l->h <   t->r->h) {t->isR = 1;}
  76.             if (t->l->h ==  t->r->h) {t->isL = t->isR = 1;}
  77.         }
  78.     }
  79. }
  80.  
  81. void traverse2(Node * t){
  82.     if(t){
  83.         if(t->l) traverse2(t->l);
  84.         if(t->r) traverse2(t->r);
  85.         if (t->l==0 && t->r==0) t->lc = 1;
  86.    
  87.         int n = 0;
  88.         if ((t->l && !t->r) || (t->l && t->r && (t->l->h > t->r->h))) n+= t->l->lc;
  89.         if ((t->r && !t->l) || (t->r && t->l && (t->r->h > t->l->h))) n+= t->r->lc;
  90.         if (t->r && t->l && (t->r->h == t->l->h)) n += t->r->lc + t->l->lc;
  91.        
  92.         if (n) t->lc = n;
  93.     }
  94. }
  95.  
  96. void traverse3(Node * t, int n){
  97.     if (t != 0){
  98.         t->ans += t->lc * n;
  99.         if (t->l && t->isL) traverse3(t->l, n);
  100.         if (t->r && t->isR) traverse3(t->r, n);
  101.     }
  102. }
  103. void del(Node * t){
  104.     if (t->l && !t->r){ t->v = t->l->v; t->r = t->l->r; t->l = t->l->l;}
  105.     else
  106.     if (t->r && !t->l){ t->v = t->r->v; t->l = t->r->l; t->r = t->r->r;}
  107.     else
  108.     if (t->r && t->l){
  109.         if (t->r->l == 0) { t->v = t->r->v; t->r = t->r->r;}
  110.         else{
  111.             Node * tmp = t->r->l;
  112.             Node * tmp2 = t->r;
  113.             while(tmp->l){ tmp = tmp->l; tmp2 = tmp2->l;}
  114.             tmp2->l = tmp->r;
  115.             t->v = tmp->v;
  116.         }
  117.     }
  118.     else
  119.     if (!t->r && !t->l){ t->pr = false;}
  120. }
  121. void traverse4(Node * t){
  122.     if(t){
  123.         traverse4(t->l);
  124.         if (beOrNotToBe && t->ans && t->ans%2==0){
  125.             beOrNotToBe = 0;
  126.             cout << t->v << endl;
  127.             del(t);
  128.         }
  129.         traverse4(t->r);
  130.     }
  131. }
  132.  
  133. int main(){
  134.     std::ifstream ifs("tst.in");
  135.    
  136.     root = new Node(-10000); ifs>>root->v; int kk = 1;
  137.     if (root->v == -10000) return 0;
  138.     while (!ifs.eof()){
  139.         kk ++;
  140.         int tmp; ifs>>tmp; insert(root, tmp);
  141.     }
  142.     if (kk == 1){
  143.         ofs << root->v;
  144.     }
  145.     //else if (kk == 2){
  146.     //  if (root->l) ofs << root->v << endl << root->l->v;
  147.     //  if (root->r) ofs << root->v << endl << root->r->v;
  148.     //}
  149.     else{
  150.         traverse(root);
  151.         if ((root->l && !root->r) || (root->r && !root->l))
  152.         {
  153.             if (root->h == maxHalf)
  154.                 nodeSet.insert(root);
  155.             if (root->h > maxHalf){
  156.                 nodeSet.clear();
  157.                 nodeSet.insert(root);
  158.             }
  159.         }
  160.         //for (Node * t : nodeSet) { t->isL = t->isR = 1;}
  161.         traverse2(root);
  162.         for (Node * t: nodeSet) {
  163.             if (t->l && t->r){
  164.                 t->ans += t->l->lc * t->r->lc;
  165.                 traverse3(t->l, t->r->lc);
  166.                 traverse3(t->r, t->l->lc);
  167.             }
  168.             if (t->l && !t->r){
  169.                 t->ans += t->l->lc;
  170.                 traverse3(t->l, 1);
  171.             }
  172.             if (!t->l && t->r){
  173.                 t->ans += t->r->lc;
  174.                 traverse3(t->r, 1);
  175.             }
  176.         }
  177.         traverse4(root);
  178.         print(root);
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement