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/ 转载请说明
  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4472269.html
Copyright © 2011-2022 走看看