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; }
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 }
▲22:20:07 BZOJ3669: 魔法森林(Noi2014) LCT/动态最小生成树/排序降维/
请注意把大数组/结构体开在一起!!而且开在读入挂等函数上方!!!!"数组开小但是查不出来"是会呼吸的痛 O__O
2016-12-19 周一 (21)
▲10:38:26 HDU5398 GCD Tree:LCT/动态最大生成树/神YY贪心/【你卡内存我就内存回收!!】
神贪心:每个数字x只和因子y连接!一定可以保证这样连可以得到最优解.确定了贪心的思路就直接找出因子然后LCT就好了.