zoukankan      html  css  js  c++  java
  • hdu 1890 Robotic Sort

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

    如下:

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<iostream>
      4 #include<algorithm>
      5 using std::sort;
      6 using std::swap;
      7 const int Max_N = 100010;
      8 struct node{
      9     int val, pos;
     10 }rec[100001];
     11 inline bool cmp(const node &a, const node &b){
     12     if (a.val == b.val) return a.pos < b.pos;
     13     return a.val < b.val;
     14 }
     15 struct Node{
     16     int v, s, rsz, rev;
     17     Node *pre, *ch[2];
     18     inline void set(int _v = -1, int _s = 0, Node *p = NULL){
     19         v = _v, s = _s, rev = rsz = 0;
     20         pre =  ch[0] = ch[1] = p;
     21     }
     22     inline void update(){
     23         rev ^= 1;
     24         swap(ch[0], ch[1]);
     25     }
     26     inline void push_up(){
     27         s = ch[0]->s + ch[1]->s + 1;
     28         rsz = ch[0]->rsz + ch[1]->rsz;
     29         if (v != -1) rsz++;
     30     }
     31     inline void push_down(){
     32         if (rev != 0){
     33             rev ^= 1;
     34             ch[0]->update();
     35             ch[1]->update();
     36         }
     37     }
     38 };
     39 struct SplayTree{
     40     int top = 0;
     41     Node *tail, *root, *null;
     42     Node stack[Max_N], *store[Max_N], *ptr[Max_N];
     43     void init(int n){
     44         top = 0;
     45         tail = &stack[0];
     46         null = tail++;
     47         null->set();
     48         root = newNode(-1);
     49         root->ch[1] = newNode(-1);
     50         root->ch[1]->pre = root;
     51         Node *x = built(1, n);
     52         root->ch[1]->ch[0] = x;
     53         x->pre = root->ch[1];
     54         root->ch[1]->push_up();
     55         root->push_up();
     56     }
     57     inline Node *built(int l, int r){
     58         Node *p = null;
     59         if (l > r) return null;
     60         int mid = (l + r) >> 1;
     61         p = newNode(rec[mid].val), ptr[mid] = p;
     62         p->ch[0] = built(l, mid - 1);
     63         if (p->ch[0] != null) p->ch[0]->pre = p;
     64         p->ch[1] = built(mid + 1, r);
     65         if (p->ch[1] != null) p->ch[1]->pre = p;
     66         p->push_up();
     67         return p;
     68     }
     69     inline Node *newNode(int v){
     70         Node *p = null;
     71         if (!top) p = tail++;
     72         else p = store[--top];
     73         p->set(v, 1, null);
     74         return p;
     75     }
     76     inline void rotate(Node *x, int d){
     77         Node *y = x->pre;
     78         y->push_down(), x->push_down();
     79         y->ch[!d] = x->ch[d];
     80         if (x->ch[d] != null) x->ch[d]->pre = y;
     81         x->pre = y->pre;
     82         if (y->pre != null) y->pre->ch[y->pre->ch[0] != y] = x;
     83         x->ch[d] = y;
     84         y->pre = x;
     85         y->push_up();
     86         if (y == root) root = x;
     87     }
     88     inline void splay(Node *x, Node *f){
     89         for (; x->pre != f; x->push_down()){
     90             if (x->pre->pre == f){
     91                 rotate(x, x->pre->ch[0] == x);
     92             } else {
     93                 Node *y = x->pre, *z = y->pre;
     94                 if (z->ch[0] == y){
     95                     if (y->ch[0] == x) rotate(y, 1), rotate(x, 1);
     96                     else rotate(x, 0), rotate(x, 1);
     97                 } else {
     98                     if (y->ch[1] == x) rotate(y, 0), rotate(x, 0);
     99                     else rotate(x, 1), rotate(x, 0);
    100                 }
    101             }
    102         }
    103         x->push_up();
    104     }
    105     inline Node *select(Node *x, int k){
    106         int t = 0;
    107         for (;;){
    108             x->push_down();
    109             t = x->ch[0]->s;
    110             if (k == t + 1) break;
    111             else if (k < t + 1) x = x->ch[0];
    112             else k -= t + 1, x = x->ch[1];
    113         }
    114         return x;
    115     }
    116     inline void del(){
    117         Node *x = root;
    118         store[top++] = x;
    119         root = root->ch[1];
    120         root->pre = null;
    121         splay(select(root, 1), null);
    122         root->ch[0] = x->ch[0];
    123         root->ch[0]->pre = root;
    124         root->push_up();
    125     }
    126     inline void solve(int n) {
    127         const int N = n + 2;
    128         for (int i = 1; i <= n; ++i) {
    129             scanf("%d", &rec[i].val);
    130             rec[i].pos = i;
    131         }
    132         init(n), sort(rec + 1, rec + n + 1, cmp);
    133         splay(root->ch[1], null);
    134         for (int i = 1; i <= n; i++){
    135             splay(ptr[rec[i].pos], null);
    136             root->ch[0]->update();
    137             printf("%d", root->ch[0]->rsz + i);
    138             if (i != n) printf(" ");
    139             del();
    140         }
    141         printf("
    ");
    142     }
    143 }spt;
    144 int main(){
    145 #ifdef LOCAL
    146     freopen("in.txt", "r", stdin);
    147     freopen("out.txt", "w+", stdout);
    148 #endif
    149     int n;
    150     while (~scanf("%d", &n) && n) {
    151         spt.solve(n);
    152     }
    153     return 0;
    154 }
    View Code
    By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
  • 相关阅读:
    Mybatis和Hibernate
    SpringMVC运行原理
    HTML中class属性里有多个属性值
    json对象(增加数据)
    Ajax请求
    <url-pattern>里的/和/*
    mysql忘记密码
    Eclipse无法正常连接mysql8.0.20
    a+1和&a+1
    可重入函数与不可重入函数
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4472269.html
Copyright © 2011-2022 走看看