Since12-13(21)

2016-12-13 周二 (1)

▲NOI2014 起床困难户 数位DP
打开了Splay的大门....


 

2016-12-14 周三 (5)

▲HNOI2002 营业额统计 Splay 插入 查找前驱后继

▲NOI2004 郁闷的出纳员 Splay+删除前缀区间

▲HNOI2004 宠物收养所 Splay +删除单点

▲POJ3468 A Simple Problem with Integers Splay区间更新/查询


 

2016-12-15 周四 (8)

▲15:36:15 HDU1890 Robotic Sort Splay:延迟更新/区间更新

▲17:00:09 HDU3487 Play with Chain Splay:区间移动插入/区间翻转

▲22:17:22 NOI2005 维修数列 Splay :区间赋值/翻转/删除/插入一个区间/维护区间和/维护序列最大连续和/

         1.注意翻转+最大连续和的情况:在更新区间时不仅要把左右儿子交换过来,还要把Lmx和Rmx交换过来!!!!(T_T)

   2.卡内存时,借用栈来搞一个内存槽...把已经删除的元素记下来重复使用.


 

2016-12-16 周五 (9)

▲15:44:31 HDU2475 Box: Splay/区间移动/更新/对于一棵子树的移动->对每个节点设置一个结束符,在结束符里的所有节点都在子树内,把树变成了序列,再用Splay解决.

开始学LCT!!!!


 

2016-12-17 周六 (13)

▲10:44:07 ZJOI2008 树的统计Count LCT模板题:单点更新,链上求和/求最值

1.把x变为原树的根时,注意将x翻转,即rev[x]^=1.

2.在rotate操作时,把x变为z的儿子前要判断是否满足条件.

3.更新权值时,要up

4.权值含负数,因此要把w[0],mx[0]设为-oo

▲15:55:24 HDU2475 Box:LCT/子树的切割和连接/模板题  ->找前驱,后继,最值不要忘记写ELSE!!!! 

▲16:30:51 BZOJ2002/Hnoi2010 Bounce 弹飞绵羊 LCT/子树切割和连接/维护Splay后左子树的sz,来求节点的深度  (咳咳,我是不会把绵羊弹飞的~~)

▲BestCoder Round #90 1001(HDU5995)/1002(HDU5996)  第二题我居然猜到了正解233..rank又跌了╭(╯^╰)╮


 

2016-12-18 周日 (16)

▲09:42:58 BC#90 1003/HDU5997 rausen loves cakes 启发式合并/线段树/BIT

▲15:01:58 HDU4010 Query On the trees LCT/子树移动/链上点权权值/链上求点权最值/两点连边

    1.求前驱时要DOWN!!!

    2.Splay操作之前要把x节点到Splay的根的所有节点先Down一遍

    3.down(有权值加减操作)的时候要判断两个儿子是否为0,若为0就不down.

    4.切断x,y之间的边,而且需要判断操作是否合法时,直接判断提根后y的左儿子是不是x.

void Upd_rev(int x){
    rev[x]^=1;
    swap(ch[x][0],ch[x][1]);
}
void Upd_add(int x,int v){
    add[x]+=v;
    mx[x]+=v;
    w[x]+=v;
    sum[x]+=sz[x]*v;
}
void Make_rt(int x){
    Access(x);Splay(x);Upd_rev(x);
}
void Cut(int x){//把x和它父亲之间连的边删除,(确定根的情况下 )
    Access(x);Splay(x);
    fa[ch[x][0]]=0;
    ch[x][0]=0;
    Up(x);
}
void Cut(int x,int y){//把x和y连的边 删掉 
    Make_rt(x);
    Access(y);Splay(y);
    fa[x]=0;
    ch[y][0]=0;
    Up(y);
}
void Link(int x,int y){//在x,y之间连边 
    Make_rt(y);
    fa[y]=x;
    Access(y); 
}
void Add(int x,int y,int v){//x,y路径上的点权+v
    Make_rt(x);
    Access(y);
    Splay(y);
    Upd_add(v);
}
int Query(int x,int y){//求x,y路径上的信息:最值/求和 
    Make_rt(x);
    Access(y);
    Splay(y);
}
int find_rt(int x){//求x所在的树的根 
    Access(x);
    Splay(x);
    while(ch[x][0])x=ch[x][0];
    return x;
}
LCT基本操作
 1 bool chk(int x){ 
 2     return ch[fa[x]][0]==x||ch[fa[x]][1]==x; 
 3 } 
 4 void Rotate(int x){ 
 5     int y=fa[x],z=fa[fa[x]],son; 
 6     bool a=ch[y][1]==x,b=ch[z][1]==y; 
 7     son=ch[x][a^1]; 
 8     if(chk(y))ch[z][b]=x;fa[x]=z; 
 9     ch[y][a]=son;fa[son]=y; 
10     ch[x][a^1]=y;fa[y]=x; 
11     Up(y); 
12 } 
13 void Splay(int x){ 
14     int y,z; 
15     while(chk(x)){ 
16         y=fa[x],z=fa[fa[x]]; 
17         if(chk(y)){ 
18             if(ch[y][0]==x^ch[z][0]==y)Rotate(x); 
19             else Rotate(y); 
20         } 
21         Rotate(x); 
22     } 
23     Up(x); 
24 } 
25 void Access(int x){ 
26     for(int t=0;x;t=x,x=fa[x]){ 
27         Splay(x);ch[x][1]=t;Up(x); 
28     } 
29 } 
LCT

 

▲22:20:07 BZOJ3669: 魔法森林(Noi2014)  LCT/动态最小生成树/排序降维/

      请注意把大数组/结构体开在一起!!而且开在读入挂等函数上方!!!!"数组开小但是查不出来"是会呼吸的痛 O__O 


 

2016-12-19 周一 (21)

▲10:38:26 HDU5398 GCD Tree:LCT/动态最大生成树/神YY贪心/【你卡内存我就内存回收!!】

      神贪心:每个数字x只和因子y连接!一定可以保证这样连可以得到最优解.确定了贪心的思路就直接找出因子然后LCT就好了.

posted @ 2016-12-17 11:08  LIN452  阅读(58)  评论(0编辑  收藏  举报