zoukankan      html  css  js  c++  java
  • Treap模板

      1 /*************************************************************************
      2     > File Name: D.cpp
      3     > Author: Stomach_ache
      4     > Mail: sudaweitong@gmail.com
      5     > Created Time: 2014年10月03日 星期五 14时55分53秒
      6     > Propose: 
      7  ************************************************************************/
      8 #include <cmath>
      9 #include <ctime>
     10 #include <string>
     11 #include <cstdio>
     12 #include <vector>
     13 #include <fstream>
     14 #include <cstring>
     15 #include <iostream>
     16 #include <algorithm>
     17 using namespace std;
     18 /*Let's fight!!!*/
     19 
     20 typedef struct TreeNode* pTree;
     21 pTree null, root;
     22 struct TreeNode {
     23     int value, size, prior;
     24     //======
     25     int ans, Lval, Rval;
     26     //======
     27     pTree lch, rch;
     28     TreeNode() : value(0), size(0) {
     29           lch = rch = NULL;
     30     }
     31     TreeNode(int val);
     32 };
     33 
     34 TreeNode::TreeNode(int val) : value(val), size(1) {
     35     lch = rch = NULL;
     36     prior = rand() % 1000000000 + 1;
     37     Lval = Rval = val;
     38     ans = 1;
     39 }
     40 
     41 int GetRightValue(pTree t) {
     42f (!t->rch) return t->value;
     43     return GetRightValue(t->rch);
     44 }
     45 
     46 int GetLeftValue(pTree t) {
     47     if (!t->lch) return t->value;
     48     return GetLeftValue(t->lch);
     49 }
     50 
     51 int GetSize(pTree t) {
     52       if (!t) return 0;
     53       return t->size;
     54 }
     55 
     56 int GetAns(pTree t) {
     57     if (!t) return 0;
     58     return t->ans;
     59 }
     60 
     61 void pushUp(pTree t) {
     62     if (!t) return ;
     63     t->size = 1 + GetSize(t->lch) + GetSize(t->rch);
     64     if (t->lch) 
     65         t->Lval = t->lch->Lval;
     66     else 
     67         t->Lval = t->value;
     68     if (t->rch)
     69           t->Rval = t->rch->Rval;
     70     else 
     71           t->Rval = t->value;
     72 
     73     t->ans = 1 + GetAns(t->lch) + GetAns(t->rch);
     74     if (t->lch && t->value == t->lch->Rval) t->ans--;
     75     if (t->rch && t->value == t->rch->Lval) t->ans--;
     76 }
     77 
     78 void Split(pTree t, pTree &l, pTree &r, int key, int add = 0) {
     79     if (!t) {
     80         l = r = NULL;
     81         return ;
     82     }
     83 
     84     int cur_add = add + GetSize(t->lch);
     85     if (cur_add >= key) Split(t->lch, l, t->lch, key, add), r = t;
     86     else Split(t->rch, t->rch, r, key, add + GetSize(t->lch) + 1), l = t;
     87     pushUp(l);
     88     pushUp(r);
     89 }
     90 
     91 void Merge(pTree &t, pTree l, pTree r) {
     92       // Merge two subtree
     93     pushUp(l);
     94     pushUp(r);
     95     if (!l|| !r) {
     96           t = l ? l : r;
     97         return ;
     98     }
     99 
    100     if (l->prior > r->prior) Merge(l->rch, l->rch, r), t = l;
    101     else Merge(r->lch, l, r->lch), t = r;
    102     pushUp(t);
    103 }
    104 
    105 void insert(pTree &t, int val) {
    106     pTree tmp = new TreeNode(val);
    107     Merge(t, t, tmp);
    108 }
    109 
    110 void write(pTree t) {
    111       if (!t) return ;
    112     write(t->lch);
    113     cout << t->value << " ";
    114     write(t->rch);
    115 }
    116 
    117 int get(pTree root, int l, int r) {
    118       pTree t1, t2, t3;
    119     // spliting tree in three segments t1, t2, t3;
    120     Split(root, t1, t3, r);
    121     Split(t1, t1, t2, l - 1);
    122     // t2 = segment from l to r
    123     int ret = t2->ans;
    124     // get back to start position
    125     Merge(t1, t1, t2);
    126     Merge(root, t1, t3);
    127     return ret;
    128 }
    129 
    130 void replacing(pTree &root, int l, int r) {
    131       pTree t1, t2, t3;
    132     // spliting tree in three segments t1, t2, t3
    133     Split(root, t1, t3, r);
    134     Split(t1, t1, t2, l - 1);
    135     // merging them in this order: t2, t1, t3
    136     Merge(t1, t2, t1);
    137     Merge(root, t1, t3);
    138 }
    139 
    140 void read(int &res) {
    141     res = 0;
    142     char c = ' ';
    143     while (c < '0' || c > '9') c = getchar();
    144     while (c >= '0' && c <= '9') res = (res<<3) + (res<<1) + c - '0', c = getchar();
    145 }
    146 
    147 int main(void) {
    148       srand(time(0));
    149     //null = new TreeNode();
    150     //null->lch = null->rch = null;
    151     //null->size = null->value = 0;
    152 
    153     ios::sync_with_stdio(false);
    154     int tcase;
    155     read(tcase);
    156     while (tcase--) {
    157           root = NULL;
    158           int N, M, val, op, l, r;
    159         read(N);
    160         for (int i = 1; i <= N; i++) {
    161               read(val);
    162             insert(root, val);
    163         }
    164         read(M);
    165         while (M--) {
    166               read(op), read(l), read(r);
    167             if (op == 1) {
    168                   int res = get(root, l, r);
    169                 cout << res << endl;
    170             } else {
    171                   replacing(root, l, r);
    172             }
    173         }
    174     }
    175 
    176     return 0;
    177 }
  • 相关阅读:
    docker network
    mongodb索引
    docker中管理数据
    mysql表备份及还原
    Find and run the whalesay image
    Learn about images & containers
    docker installation on ubuntu
    【转载】熟练利用google hacking来辅助我们快速渗透
    xmind常用快捷键
    漏洞挖掘基础
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/4006801.html
Copyright © 2011-2022 走看看