zoukankan      html  css  js  c++  java
  • BZOJ1507 [NOI2003]Editor

    是一道裸的Splay(反正我不会Splay,快嘲笑我!)

    只需要维护在数列上加点删点操作即可,不会写Splay的渣渣只好Orz iwtwiioi大神一下了。(后来发现程序直接抄来了。。。)

    就当我的第一个Splay程序吧。

      1 /**************************************************************
      2     Problem: 1507
      3     User: rausen
      4     Language: C++
      5     Result: Accepted
      6     Time:2560 ms
      7     Memory:43860 kb
      8 ****************************************************************/
      9  
     10 #include <cstdio>
     11 #include <cstring>
     12  
     13 using namespace std;
     14 char strI[1500000];
     15  
     16 struct Splay{
     17     struct node{    
     18         node *son[2], *fa;
     19         char key;
     20         int size;
     21         node(){
     22             son[0] = son[1] = fa = NULL;
     23             size = key = 0;
     24         }
     25         void pushup(){
     26             size = son[0] -> size + son[1] -> size + 1;
     27         }
     28          
     29         bool d(){
     30             return this == fa -> son[1];
     31         }
     32          
     33         void setc(node *c, int d){
     34             son[d] = c;
     35             c -> fa = this;
     36         }
     37     } * null, *root;
     38      
     39     Splay(){
     40         null = new node;
     41         root = null;
     42         root = newnode(0);
     43         node *t = newnode(0);
     44         root -> setc(t, 1);
     45         root -> pushup();
     46     }
     47      
     48     node *newnode(char K){
     49         node *res = new node;
     50         res -> son[0] = res -> son[1] = res -> fa = null;
     51         res -> key  = K, res -> size = 1;
     52         return res;
     53     }
     54      
     55     void rotate(node *r){
     56         node *fa = r -> fa;
     57         bool d = r -> d();
     58         fa -> fa -> setc(r, fa -> d());
     59         fa -> setc(r -> son[!d], d);
     60         r -> setc(fa, !d);
     61         fa -> pushup();
     62         if (fa == root) root = r;
     63     }
     64      
     65     void splay(node *r, node *X){
     66         while (r -> fa != X){
     67             if (r -> fa -> fa == X) rotate(r);
     68             else r -> d() == r -> fa -> d() ? (rotate(r -> fa), rotate(r)) : (rotate(r), rotate(r));
     69         }
     70         r -> pushup();
     71     }
     72      
     73     node *sel(int k){
     74         int s;
     75         for(node *t = root; ;){
     76             s = t -> son[0] -> size;
     77             if (s == k) return t;
     78             t = t -> son[k > s];
     79             if (k > s) k -= s + 1;
     80         }
     81     }
     82      
     83     node *getrange(int l, int r){
     84         node *left = sel(l); splay(left, null);
     85         node *right = sel(r); splay(right, left);
     86         return right;
     87     }
     88      
     89     void insert(int w, int cur){
     90         node *t = getrange(w, w + 1);
     91         t -> setc(build(0, cur), 0);
     92         t -> pushup();
     93         splay(t, null);
     94     }
     95      
     96     void remove(int w, int n){
     97         node *t = getrange(w, w + n + 1);
     98         t -> setc(null, 0);
     99         t -> pushup();
    100         splay(t, null);
    101     }
    102      
    103     node *build(int l, int r){
    104         if (l >= r) return null;
    105         int m = (l + r) >> 1;
    106         node *t = newnode(strI[m]);
    107         t -> setc(build(l, m), 0);
    108         t -> setc(build(m + 1, r), 1);
    109         t -> pushup();
    110         return t;
    111     }
    112      
    113     void print(node *r){
    114         if (r == null) return;
    115         print(r -> son[0]);
    116         printf("%c", r -> key);
    117         print(r -> son[1]);
    118     }
    119      
    120     void print(int w, int n){
    121         node *t = getrange(w, w + n + 1);
    122         print(t -> son[0]);
    123         printf("
    ");
    124     }
    125 } splay;
    126  
    127 char s[10];
    128  
    129 int main(){
    130     int n, T, cur, w = 0;
    131     scanf("%d", &T);
    132     while (T--){
    133         scanf("%s", s);
    134         if (s[0] == 'M')
    135             scanf("%d", &w);
    136         else if (s[0] == 'P')
    137             --w;
    138         else if (s[0] == 'N')
    139             ++w;
    140         else if (s[0] == 'D'){
    141             scanf("%d", &n);
    142             splay.remove(w, n);
    143         } else
    144         if (s[0] == 'G'){   
    145             scanf("%d", &n);
    146             splay.print(w, n);
    147         } else
    148         if (s[0] = 'I'){
    149             scanf("%d", &n);
    150             cur = 0;
    151             while (n--){
    152                 while(strI[cur] = getchar(), strI[cur] == '
    ');
    153                 cur++;
    154             }
    155             splay.insert(w, cur);
    156         }
    157     }
    158     return 0;
    159 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    Sql server 2012 企业中文版安装图文教程
    sql server安装图解
    Unknown custom element: <swiper>
    CSS3实现鼠标移动到图片上图片变大(缓慢变大,有过渡效果,放大的过程是有动画过渡的,这个过渡的时间可以自定义)
    在vue中使用animate.css
    linux配置jdk
    orcal解决锁表
    java 基础知识
    fastjson解析list ,object中含有list, object中含有map
    vue的周期函数
  • 原文地址:https://www.cnblogs.com/rausen/p/4000400.html
Copyright © 2011-2022 走看看