zoukankan      html  css  js  c++  java
  • hdu 4217 Data Structure?/treap

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 

    可用线段树写,效率要高点。

    这道题以前用c语言写的treap水过了。。

    现在接触了c++重写一遍。。。

    不带重复元素的插入删除第k大带垃圾回收,具体如下:

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<iostream>
      4 #include<algorithm>
      5 typedef long long ll;
      6 const int MAX_N = 300100;
      7 struct Node{
      8     int v, s, fix;
      9     Node *ch[2];
     10     inline void 
     11     set(int _fix, int _v = 0, int _s = 0, Node *p = NULL){
     12         fix = _fix, v = _v, s = _s;
     13         ch[0] = ch[1] = p;
     14     }
     15     inline void push_up(){
     16         s = ch[0]->s + ch[1]->s + 1;
     17     }
     18 };
     19 int run(){
     20     static int x = 184082857;
     21     x += (x << 2) | 1;
     22     return x;
     23 }
     24 struct Treap{
     25     Node *tail, *null, *root;
     26     Node stack[MAX_N];
     27     int top;
     28     Node *store[MAX_N];
     29     void init(){
     30         tail = &stack[0];
     31         null = tail++;
     32         null->set(0x7fffffff);
     33         root = null;
     34         top = 0;
     35     }
     36     inline Node *newNode(int v){
     37         Node *p = null;
     38         if (top) p = store[--top];
     39         else p = tail++;
     40         p->set(run(), v, 1, null);
     41         return p;
     42     }
     43     inline void rotate(Node* &x, int d){
     44         Node *k = x->ch[!d];
     45         x->ch[!d] = k->ch[d];
     46         k->ch[d] = x;
     47         k->s = x->s;
     48         x->push_up();
     49         x = k;
     50     }
     51     inline void insert(Node* &x, int v){
     52         if (x == null){
     53             x = newNode(v);
     54             return;
     55         } else {
     56             int d = v > x->v;
     57             insert(x->ch[d], v);
     58             if (x->ch[d]->fix < x->fix) rotate(x, !d);
     59             x->push_up();
     60         }
     61     }
     62     inline void del(Node* &x, int v){
     63         if (x == null) return;
     64         x->s--;
     65         if (x->v == v){
     66             if (x->ch[0] == null || x->ch[1] == null){
     67                 store[top++] = x;
     68                 x = x->ch[0] == null ? x->ch[1] : x->ch[0];
     69             } else {
     70                 int d = x->ch[0]->fix < x->ch[1]->fix;
     71                 rotate(x, !d);
     72                 del(x->ch[!d], v);
     73             }
     74         } else {
     75             del(x->ch[v>x->v], v);
     76         }
     77         if (x != null) x->push_up();
     78     }
     79     inline int find_kth(Node *x, int k){
     80         int t = 0;
     81         for (;;){
     82             t = x->ch[0]->s;
     83             if (k == t + 1) break;
     84             else if (k < t + 1) x = x->ch[0];
     85             else k -= t + 1, x = x->ch[1];
     86         }
     87         return x->v;
     88     }
     89     inline void insert(int v){
     90         insert(root, v);
     91     }
     92     inline void del(int v){
     93         del(root, v);
     94     }
     95     inline int find_kth(int k){
     96         return find_kth(root, k);
     97     }
     98 }treap;
     99 int main(){
    100 #ifdef LOCAL
    101     freopen("in.txt", "r", stdin);
    102     freopen("out.txt", "w+", stdout);
    103 #endif
    104     ll ans;
    105     int t, n, m, k, tmp, c = 1;
    106     scanf("%d", &t);
    107     while (t--){
    108         treap.init(), ans = 0;
    109         scanf("%d %d", &n, &m);
    110         for (int i = 1; i <= n; i++) treap.insert(i);
    111         while (m--){
    112             scanf("%d", &k);
    113             ans += tmp = treap.find_kth(k);
    114             treap.del(tmp);
    115         }
    116         printf("Case %d: %lld
    ", c++, ans);
    117     }
    118     return 0;
    119 }
    View Code
    By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
  • 相关阅读:
    Git fetch和git pull的区别
    gitlab数据迁移
    阿里云CentOS7挂载SSD云盘的方法
    phpQuery的用法
    用shell查找某目录下的最大文件
    gearman 简介
    学习笔记(3)——实验室集群WMS服务配置
    学习笔记(2)——实验室集群LVS配置
    Fedora16的双显卡切换问题
    学习笔记(1)——实验室集群配置
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4454473.html
Copyright © 2011-2022 走看看