zoukankan      html  css  js  c++  java
  • splay HYSBZ1588

    n天

    n个营业额;

    sum(min(abs(wi-前面)));

    splay维护一下就可以

      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<math.h>
      4 
      5 using namespace std;
      6 #define inf 2000000000
      7 int sum,time,flag,root;
      8 
      9 struct node
     10 {
     11     int fa,l,r,w;
     12 }tree[100010];
     13 void rightrotate(int x) //右旋
     14 {
     15     int y=tree[x].fa;
     16     int z=tree[y].fa;
     17     tree[y].l=tree[x].r;
     18     if(tree[x].r!=-1)
     19         tree[tree[x].r].fa=y;
     20     tree[x].fa=z;
     21     if(z!=-1)
     22     {
     23         if(tree[z].l==y)
     24             tree[z].l=x;
     25         else
     26             tree[z].r=x;
     27     }
     28     tree[x].r=y;
     29     tree[y].fa=x;
     30 }
     31 void leftrotate(int x)//左旋
     32 {
     33     int y=tree[x].fa;
     34     int z=tree[y].fa;
     35     tree[y].r=tree[x].l;
     36     if(tree[x].l!=-1)
     37         tree[tree[x].l].fa=y;
     38     tree[x].fa=z;
     39     if(z!=-1)
     40     {
     41         if(tree[z].l==y)
     42             tree[z].l=x;
     43         else
     44             tree[z].r=x;
     45     }
     46     tree[x].l=y;
     47     tree[y].fa=x;
     48 }
     49 void splay(int x)
     50 {
     51     while(tree[x].fa!=-1)
     52     {
     53          int y=tree[x].fa;
     54          int z=tree[y].fa;
     55          if(z==-1)                  //6种旋转情况
     56          {
     57              if(tree[y].l==x)
     58                 rightrotate(x);
     59              else
     60                 leftrotate(x);
     61          }
     62          else
     63          {
     64              if(tree[z].l==y&&tree[y].l==x)
     65              {
     66                  rightrotate(y);
     67                  rightrotate(x);
     68              }
     69              else if(tree[z].l==y&&tree[y].r==x)
     70              {
     71                  leftrotate(x);
     72                  rightrotate(x);
     73              }
     74              else if(tree[z].r==y&&tree[y].r==x)
     75              {
     76                  leftrotate(y);
     77                  leftrotate(x);
     78              }
     79              else
     80              {
     81                  rightrotate(x);
     82                  leftrotate(x);
     83              }
     84          }
     85     }
     86     root=x;
     87 }
     88 void BST_insert(int w,int x)  //插入  就和二叉排序树一样
     89 {
     90     if(w==tree[x].w)
     91     {
     92         flag=false;
     93         splay(x);
     94         return ;
     95     }
     96     else if(w<tree[x].w)
     97     {
     98         if(tree[x].l==-1)
     99         {
    100             tree[x].l=time;
    101             tree[time].fa=x;
    102             tree[time].l=tree[time].r=-1;
    103             tree[time].w=w;
    104         }
    105         else
    106             BST_insert(w,tree[x].l);
    107     }
    108     else
    109     {
    110         if(tree[x].r==-1)
    111         {
    112             tree[x].r=time;
    113             tree[time].fa=x;
    114             tree[time].l=tree[time].r=-1;
    115             tree[time].w=w;
    116         }
    117         else
    118             BST_insert(w,tree[x].r);
    119     }
    120 }
    121 int f_pr(int x)  //前面最大
    122 {
    123     int y=tree[x].l;
    124     if(y==-1)
    125         return y;
    126     while(tree[y].r!=-1)
    127         y=tree[y].r;
    128     return y;
    129 }
    130 int f_ne(int x) //后面最小
    131 {
    132     int y=tree[x].r;
    133     if(y==-1)
    134         return y;
    135     while(tree[y].l!=-1)
    136         y=tree[y].l;
    137     return y;
    138 }
    139 void Insert(int w)
    140 {
    141     flag=true;
    142     time++;
    143     BST_insert(w,root);
    144     if(flag==false)
    145         return ;
    146     splay(time);
    147     int q=f_pr(time);
    148     int p=f_ne(time);
    149     int mi=inf;
    150     if(q!=-1)
    151         mi=min(mi,abs(tree[q].w-w));
    152     if(p!=-1)
    153         mi=min(mi,abs(tree[p].w-w));
    154     sum+=mi;
    155 }
    156 int main()
    157 {
    158     int n;
    159     while(scanf("%d",&n)!=EOF)
    160     {
    161             scanf("%d",&sum);
    162             time=1;
    163             tree[time].fa=tree[time].l=tree[time].r=-1;
    164             tree[time].w=sum;
    165             root=time;
    166             for(int i=1;i<n;i++)
    167             {
    168                 int a;
    169                 scanf("%d",&a);
    170                 Insert(a);
    171             }
    172             printf("%d
    ",sum);
    173     }
    174     return 0;
    175 }
  • 相关阅读:
    Android属性动画之ValueAnimation
    Android属性动画之第一重修炼总结
    Android属性动画之ObjectAnimator控制
    Android属性动画之ObjectAnimator
    HDU 4334——Trouble——————【贪心&水题】
    HDU 5416——CRB and Tree——————【DFS搜树】
    HDU 4323——Magic Number——————【dp求编辑距离】2012——MUT——3
    HDU 5384——Danganronpa——————【AC自动机】
    HDU——Cover——————【技巧】
    CF 540D——Bad Luck Island——————【概率dp】
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6108174.html
Copyright © 2011-2022 走看看