• 8.4总结


    其实8.4是在昨天,只不过昨天我电脑出了点问题,输入法死活调不出来。

    主要做了2件事,一是刷KD—tree的板子题,二是自己YY一个替罪羊树的板子

    KD-tree:由于只刷了板子题,还没什么想法

    替罪羊:其实还是有点子思维量的,思想很简单,但实现要仔细斟酌,替罪羊树最核心的

    就是它的重构函数,选择适当的时间及适当的范围进行重构,从而使得子树保持平衡,便于操作

    其实感觉数组版应该比较好打,然而旁边几个人一直劝我打指针,我又不会什么骚操作,

    然后就莫名奇妙加了好多行判空;

      1 #include <bits/stdc++.h>
      2 #define N 1000006
      3 #define A 0.75
      4 #define puts puts
      5 using namespace std;
      6 struct sheep {
      7     int val, fsz, tsz, cnt;
      8     sheep *ch[2], *fa;
      9 } * rt;
     10 int tot, alr;
     11 sheep *re[N];
     12 bool pingheng(sheep *g) {
     13     return (g->ch[0] ? g->ch[0]->fsz : 0) <= g->fsz * A || (g->ch[1] ? g->ch[1]->fsz : 0) <= g->fsz * A;
     14 }
     15 void update(sheep *p) {
     16     p->fsz = p->tsz = p->cnt;
     17     if (p->ch[0] != NULL)
     18         p->fsz += p->ch[0]->fsz, p->tsz += p->ch[0]->tsz;
     19     if (p->ch[1] != NULL)
     20         p->fsz += p->ch[1]->fsz, p->tsz += p->ch[1]->tsz;
     21 }
     22 void getup(sheep *g) {
     23     if (g->ch[0] != NULL)
     24         getup(g->ch[0]);
     25     if (g->cnt)
     26         re[++alr] = g;
     27     if (g->ch[1] != NULL)
     28         getup(g->ch[1]);
     29 }
     30 sheep *build(int l, int r, sheep *f) {
     31     const int mid = l + r >> 1;
     32     if (l != mid)
     33         re[mid]->ch[0] = build(l, mid - 1, re[mid]);
     34     else
     35         re[mid]->ch[0] = NULL;
     36     if (r != mid)
     37         re[mid]->ch[1] = build(mid + 1, r, re[mid]);
     38     else
     39         re[mid]->ch[1] = NULL;
     40     update(re[mid]);
     41     re[mid]->fa = f;
     42     return re[mid];
     43 }
     44 sheep *rebuild(sheep *g, sheep *f) {
     45     alr = 0;
     46     getup(g);
     47     return build(1, alr, f);
     48 }
     49 void insert2(int x, sheep *g) {
     50     //    puts("boom at insert2");
     51     ++g->fsz;
     52     ++g->tsz;
     53     if (g->val < x) {
     54         if (g->ch[1] == NULL) {
     55             g->ch[1] = new sheep();
     56             g->ch[1]->fa = g;
     57             g->ch[1]->val = x, g->ch[1]->fsz = g->ch[1]->tsz = g->ch[1]->cnt = 1;
     58             return;
     59         }
     60         insert2(x, g->ch[1]);
     61     } else if (g->val == x) {
     62         ++g->cnt;
     63     } else {
     64         if (g->ch[0] == NULL) {
     65             g->ch[0] = new sheep();
     66             g->ch[0]->fa = g;
     67             g->ch[0]->val = x, g->ch[0]->fsz = g->ch[0]->tsz = g->ch[0]->cnt = 1;
     68             return;
     69         }
     70         insert2(x, g->ch[0]);
     71     }
     72 
     73     if (g == rt) {
     74         if (!pingheng(g)) {
     75             sheep *f = new sheep();
     76             rt = rebuild(g, f);
     77             rt->fa = NULL;
     78         }
     79         return;
     80     }
     81     if (!pingheng(g) && pingheng(g->fa)) {
     82         sheep *f = g->fa;
     83         if (f->ch[0] == g)
     84             f->ch[0] = rebuild(g, f);
     85         else
     86             f->ch[1] = rebuild(g, f);
     87     }
     88     update(g);
     89 }
     90 void insert(int p) {
     91     if (rt == NULL) {
     92         rt = new sheep(), rt->val = p, rt->fsz = rt->tsz = rt->cnt = 1;
     93         return;
     94     }
     95     insert2(p, rt);
     96 }
     97 sheep *getval(int rk) {
     98     int ans = 0;
     99     sheep *g = rt;
    100     while (1) {
    101         if (g->cnt && rk >= (g->ch[0] == NULL ? 0 : g->ch[0]->tsz) + 1 &&
    102             rk <= (g->ch[0] == NULL ? 0 : g->ch[0]->tsz) + g->cnt)
    103             return g;
    104         if (rk > (g->ch[0] ? g->ch[0]->tsz : 0) + g->cnt) {
    105             rk -= (g->ch[0] ? g->ch[0]->tsz : 0) + g->cnt;
    106             g = g->ch[1];
    107         } else
    108             g = g->ch[0];
    109     }
    110 }
    111 int getrank(int x) {
    112     int ans = 0;
    113     sheep *g = rt;
    114     while (1) {
    115         if (g->cnt && x == g->val)
    116             return ans + (g->ch[0] ? g->ch[0]->tsz : 0) + 1;
    117         if (x > g->val) {
    118             ans += (g->ch[0] ? g->ch[0]->tsz : 0) + g->cnt;
    119             g = g->ch[1];
    120         } else
    121             g = g->ch[0];
    122     }
    123 }
    124 sheep *getzz(int x) {
    125     int ans = 0;
    126     sheep *g = rt;
    127     while (1) {
    128         if (g->cnt && x == g->val)
    129             return g;
    130         if (x > g->val)
    131             g = g->ch[1];
    132         else
    133             g = g->ch[0];
    134     }
    135 }
    136 void del(sheep *p) {
    137     --p->tsz;
    138     --p->cnt;
    139     while (p != rt) {
    140         p = p->fa;
    141         update(p);
    142     }
    143 }
    144 int main() {
    145     int n, x, p;
    146     scanf("%d", &n);
    147     while (n--) {
    148         scanf("%d%d", &p, &x);
    149         switch (p) {
    150             case 1: {
    151                 insert(x);
    152                 break;
    153             }
    154             case 2: {
    155                 del(getzz(x));
    156                 break;
    157             }
    158             case 3: {
    159                 insert(x);
    160                 printf("%d
    ", getrank(x));
    161                 del(getzz(x));
    162                 break;
    163             }
    164             case 4: {
    165                 printf("%d
    ", getval(x)->val);
    166                 break;
    167             }
    168             case 5: {
    169                 insert(x);
    170                 printf("%d
    ", getval(getrank(x) - 1)->val);
    171                 del(getzz(x));
    172                 break;
    173             }
    174             case 6: {
    175                 insert(x);
    176                 printf("%d
    ", getval(getrank(x) + getzz(x)->cnt)->val);
    177                 del(getzz(x));
    178                 break;
    179             }
    180         }
    181     }
    182 }
    替罪羊

    自己的板子,有错误还请各位dalao指正;

    现在距NOIP还有94天,今天上午模拟赛后就要分机房了,我刚好在一机房和二机房的分界线出

    现在慌的一批,成败在此一举,我更应调整心态,积极面对,留在第一机房是我的实力,不能留

    也是一种经历。

  • 相关阅读:
    Js 30 BOM
    js面向对象
    js模态窗口
    js默认行为(也称默认事件)
    框架的控件隐藏
    20150706 js之定时器
    sublime快捷方式和node.js
    js回调函数2
    Hibernate 多对一
    Hibernate入门之配置文件
  • 原文地址:https://www.cnblogs.com/loadingkkk/p/11300866.html
Copyright © 2020-2023  润新知