• Splay入门题目 [HNOI2002]营业额统计


    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588

    这道题貌似很多中做法,我先是用multiset交了一发,然后又写了一发splay。

    multiset做法,这个其实就是二分了,只是用set来保持加入一个元素时保持有序

     1 #include <set>
     2 #include <map>
     3 #include <cmath>
     4 #include <ctime>
     5 #include <queue>
     6 #include <stack>
     7 #include <cctype>
     8 #include <cstdio>
     9 #include <string>
    10 #include <vector>
    11 #include <cstdlib>
    12 #include <cstring>
    13 #include <iostream>
    14 #include <algorithm>
    15 using namespace std;
    16 typedef unsigned long long ull;
    17 typedef long long ll;
    18 const int inf = 0x3f3f3f3f;
    19 const double eps = 1e-8;
    20 multiset<int>S;
    21 multiset<int>::iterator it;
    22 int main(void)
    23 {
    24     #ifndef ONLINE_JUDGE
    25         freopen("in.txt","r",stdin);
    26     #endif
    27     int n;
    28     while (~scanf ("%d",&n))
    29     {
    30         int ans = 0;
    31         S.clear();
    32         for (int i = 0; i < n; i++)
    33         {
    34             int x;
    35             if (scanf ("%d",&x) == EOF)
    36                 x = 0;
    37             it = S.lower_bound(x);
    38             if (it == S.begin())
    39                 ans += abs(*it-x);
    40             else
    41             {
    42                 int s1 = *it;
    43                 int s2 = *--it;
    44                 ans +=  min(abs(s1 - x),abs(s2 - x));
    45             }
    46             S.insert(x);
    47         }
    48         printf("%d
    ",ans);
    49     }
    50     return 0;
    51 }
    View Code

    splay

      1 #include <set>
      2 #include <map>
      3 #include <cmath>
      4 #include <ctime>
      5 #include <queue>
      6 #include <stack>
      7 #include <cctype>
      8 #include <cstdio>
      9 #include <string>
     10 #include <vector>
     11 #include <cstdlib>
     12 #include <cstring>
     13 #include <iostream>
     14 #include <algorithm>
     15 using namespace std;
     16 typedef unsigned long long ull;
     17 typedef long long ll;
     18 const int inf = 0x3f3f3f3f;
     19 const double eps = 1e-8;
     20 template <class T>
     21 inline bool scan_d(T &ret)
     22 {
     23     char c;
     24     int sgn;
     25     if(c=getchar(),c==EOF)
     26         return 0;
     27     while(c!='-'&&(c<'0'||c>'9'))
     28         c=getchar();
     29     sgn = (c=='-')?-1:1;
     30     ret =(c=='-')?0:(c-'0');
     31     while(c=getchar(),c>='0'&&c<='9')
     32         ret=ret*10+(c-'0');
     33     ret*=sgn;
     34     return 1;
     35 }
     36 const int maxn = 1e5+10;
     37 int fa[maxn],son[maxn][2],key[maxn],tot,root;
     38 
     39 
     40 
     41 void addNode(int &r,int father,int k)
     42 {
     43     r = ++tot;
     44     fa[r] = father;
     45     key[r] = k;
     46     son[r][0] = son[r][1] = 0;
     47 }
     48 
     49 void Rotate(int r,int kind)
     50 {
     51     int y = fa[r];
     52     son[y][!kind] = son[r][kind];
     53     fa[son[r][kind]] = y;
     54     if (fa[y])
     55         son[fa[y]][son[fa[y]][1]==y] = r;
     56     son[r][kind] = y;
     57     fa[r] = fa[y];
     58     fa[y] = r;
     59 }
     60 void splay(int r,int goal)
     61 {
     62     while (fa[r] != goal)
     63     {
     64         if (fa[fa[r]] == goal)
     65         {
     66             Rotate(r,son[fa[r]][0] == r);
     67         }
     68         else
     69         {
     70             int y = fa[r];
     71             int kind = (son[fa[y]][0] == y);
     72             if (son[y][kind] == r)
     73             {
     74                 Rotate(r,!kind);
     75                 Rotate(r,kind);
     76             }
     77             else
     78             {
     79                 Rotate(y,kind);
     80                 Rotate(r,kind);
     81             }
     82         }
     83     }
     84     if (goal == 0)
     85         root = r;
     86 }
     87 bool Insert(int k)
     88 {
     89     int r = root;
     90     while (son[r][k > key[r]])
     91     {
     92         if (k == key[r])
     93         {
     94             splay(r,0);
     95             return false;
     96         }
     97         r = son[r][k>key[r]];
     98     }
     99     addNode(son[r][k>key[r]],r,k);
    100     splay(son[r][k>key[r]],0);
    101     return true;
    102 }
    103 int get_pre(int r)
    104 {
    105     int tmp = son[r][0];
    106     if (tmp == 0)
    107         return inf;
    108     while (son[tmp][1])
    109         tmp = son[tmp][1];
    110     return  key[tmp];
    111 }
    112 int get_next(int r)
    113 {
    114     int tmp = son[r][1];
    115     if (tmp==0)
    116         return inf;
    117     while (son[tmp][0])
    118         tmp = son[tmp][0];
    119     return key[tmp] ;
    120 }
    121 int main(void)
    122 {
    123     #ifndef ONLINE_JUDGE
    124         freopen("in.txt","r",stdin);
    125     #endif
    126     int n;
    127     while (~scanf ("%d",&n))
    128     {
    129         tot = 0;
    130         root = 0;
    131         int ans = 0;
    132         for (int i = 0; i < n; i++)
    133         {
    134             int x;
    135             if (scanf ("%d",&x) == EOF)
    136                 x = 0;
    137             if (i == 0)
    138             {
    139                 ans += x;
    140                 addNode(root,0,x);
    141             }
    142             else
    143             {
    144                 if (!Insert(x))
    145                     continue;
    146                 int l = get_pre(root);
    147                 int r = get_next(root);
    148                 ans += min(abs(x-l),abs(x-r));
    149                 //ans += min(l,r);
    150             }
    151         }
    152         printf("%d
    ",ans);
    153     }
    154     return 0;
    155 }
    View Code
  • 相关阅读:
    (转)SpringMVC学习总结
    Golang-函数的defer
    Golang-闭包
    Golang-匿名函数
    Golang-init()
    Golang-递归
    Golang-函数、包、变量的作用域
    Golang-for、break、continue、goto、return
    Golang-程序流程控制 if、switch
    Golang-进制、源码反码补码、位运算
  • 原文地址:https://www.cnblogs.com/oneshot/p/4052715.html
Copyright © 2020-2023  润新知