题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和。

Splay在比赛的时候写得太Navie,T了整场。

左移和右移的操作就不说了,删除点的操作是,直接把第pos个点旋转成根结点,然后把这个点删除,将左右两个儿子(如果有)合并成一棵新的树。插入的时候,将pos个点旋转成根结点,然后在根和根的右儿子之间插入这个点。

同时维护sum(区间和),和mx(表示以x为根结点的最大前缀和),就可以解决这道题了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;#define LL(x) (ch[x][0])
#define RR(x) (ch[x][1])
#define Kt(x) (ch[ ch[Rt][1] ][0])
#define INF (1<<30)const int N=1e6+5;struct SplayTree
{int Rt,top;int ch[N][2],pre[N],sz[N];int key[N],sum[N],mx[N],pos;void init(){top=Rt=pos=0;pre[0]=LL(0)=RR(0)=sz[0]=0;}inline void Link(int x,int y,int f){ch[y][f]=x;     pre[x]=y;}inline void Rotate(int x,int f){int y=pre[x],z=pre[y];PushDown(y); PushDown(x);Link(ch[x][f],y,!f);Link(x,z,RR(z)==y);Link(y,x,f);PushUp(y);}inline void Splay(int x,int goal){while(pre[x]!=goal){int y=pre[x],z=pre[y];int cx=(LL(y)==x),cy=(LL(z)==y);if(z==goal) Rotate(x,cx);else{if(cx==cy) Rotate(y,cy);else Rotate(x,cx);Rotate(x,cy);}}PushUp(x);if(goal==0) Rt=x;}inline void Select(int K,int goal){int x=Rt;PushDown(x);while(1){if(sz[LL(x)]>=K) x=LL(x);else if(sz[LL(x)]+1==K) break;else K-=sz[LL(x)]+1,x=RR(x);PushDown(x);}Splay(x,goal);}inline int Join(int r1,int r2){if(!r1){if(!r2) return 0;pre[r2]=0;return r2;}int x=r1;while(RR(x)) x=RR(x);Splay(x,Rt);Link(r2,x,1);Rt=x;   pre[x]=0;PushUp(x);return x;}void addNode(int valu,int &x,int f){x=top++;pre[x]=f; LL(x)=RR(x)=0;key[x]=valu;}void PushDown(int x) {}void PushUp(int x){sz[x]=1; sum[x]=key[x];if(LL(x)) sum[x]+=sum[LL(x)],sz[x]+=sz[LL(x)];if(RR(x)) sum[x]+=sum[RR(x)],sz[x]+=sz[RR(x)];if(LL(x)){mx[x]=max(mx[LL(x)],sum[LL(x)]+key[x]);if(RR(x)) mx[x]=max(mx[x],sum[LL(x)]+key[x]+mx[RR(x)]);}else{mx[x]=key[x];if(RR(x)) mx[x]=max(mx[x],key[x]+mx[RR(x)]);}}inline void Insert(){int valu; scanf("%d",&valu);int x=++top;sz[x]=1; pre[x]=0; LL(x)=RR(x)=0;key[x]=valu; sum[x]=0; mx[x]=-INF;if(pos==0){Link(Rt,x,1);Rt=x; PushUp(Rt);}else{Select(pos,0);int tmp=RR(Rt);Link(x,Rt,1); Link(tmp,x,1);PushUp(x); PushUp(Rt);}pos++;}inline void Delete(){if(pos==0) return;Select(pos,0);Rt=Join(LL(Rt),RR(Rt));if(Rt) PushUp(Rt);pos--;}void Query(){int K; scanf("%d",&K);K=min(K,sz[Rt]);Select(K,0);int ans=-1;if(LL(Rt)) ans=max(mx[LL(Rt)],sum[LL(Rt)]+key[Rt]);else ans=key[Rt];printf("%d\n",ans);}inline void shift(int flag){if(flag==0){if(pos>0) pos--;}else{if(pos<sz[Rt]) pos++;}}void Debug(){ printf("Rt:%d\n",Rt); travel(Rt); }void travel(int x){if(x==0) return;travel(LL(x));printf("node:%d,pre:%d,sz:%d,lson:%d,rson:%d,key:%d,sum:%d,mx:%d\n",x,pre[x],sz[x],LL(x),RR(x),key[x],sum[x],mx[x]);travel(RR(x));}}spt;
int main()
{int n;while(scanf("%d",&n)!=EOF){spt.init();for(int i=0;i<n;i++){char op[100];scanf("%s",op);if(op[0]=='L') spt.shift(0);else if(op[0]=='R') spt.shift(1);else if(op[0]=='I') spt.Insert();else if(op[0]=='D') spt.Delete();else spt.Query();// spt.Debug();}}return 0;
}

hdu 4699 Editor(Splay)相关推荐

  1. hdu 4699 Editor(splay tree 伸展树)

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 解题思路:标乘是用了栈进行维 ...

  2. hdu 4699 2个栈维护 or 伸展树 (2013多校联合)

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求1到k位置的最大的前缀和.. 注意这里的k是在光标之前的 ...

  3. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  4. Flat - Music scores and guitar tabs editor(乐谱编辑器)

    插件介绍: 听音乐是一种放松心情.舒缓压力的好方法,那么你有没有想过创造一首属于自己的音乐呢?Flat - Music scores and guitar tabs editor(乐谱编辑器)是一个简 ...

  5. HDU 2282 Chocolate (最小费用最大流)

    HDU  2282 Chocolate (最小费用最大流) #include <iostream> #include <cstdio> #include <queue&g ...

  6. 【CF809D】Hitchhiking in the Baltic States(Splay,动态规划)

    [CF809D]Hitchhiking in the Baltic States(Splay,动态规划) 题面 CF 洛谷 题解 朴素\(dp\):设\(f[i][j]\)表示当前考虑到第\(i\)个 ...

  7. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...

  8. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  9. HDU 5835 Danganronpa(弹丸论破)

    HDU 5835 Danganronpa(弹丸论破) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

最新文章

  1. HTML5适应旧的浏览器的使用总结
  2. 自动驾驶有量子飞跃式改进,马斯克称年内实现L5级别自动驾驶?
  3. ADO.NET开发总结(学习笔记)
  4. autojs遍历当前页面所有控件_PyQT5控件:容器(Containers Widgets)
  5. 中国计算机学会通讯下载工具(简易爬虫)
  6. win8选择哪个python版本_Win8的几个版本该怎么选
  7. 10分钟教你用VS2017将代码上传到GitHub
  8. CSS3(七) 前端预处理技术(Less、Sass、CoffeeScript)
  9. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用36
  10. Cisdem PDF Converter OCR使用教程:在 Mac 上将PDF 转换为 Word
  11. 记住:永远不要在MySQL中使用utf8,请使用utf8mb4
  12. 免费录屏、直播推流软件之OBS Studio
  13. 三极管在ad中的原理图库_AD18 原理图库
  14. word表格一行不对齐解决方法
  15. Unity快速实现回合制游戏
  16. Optimizing radiotherapy plans for cancer treatment with Tensor Networks解读
  17. Android 记事本
  18. 【教程】如何在服务器上部署豆瓣小组抢沙发聊天机器人
  19. 计算机画图设计前景色,画图的前景色和背景色
  20. 为数据科学和机器学习选择合适的笔记本电脑,完成数据科学和机器学习任务的完美笔记本电脑的 20 个必要条件

热门文章

  1. MSP430-GRACE 实战(一):LED流水灯
  2. MDI/MDIX/Auto-MDI/MDIX的解析大全
  3. C#中各种计时器 Stopwatch、TimeSpan
  4. 搜狗收录又改规则,今天你查了吗?
  5. Metric Learning Survey 文章汇总
  6. 黑莓应用开发综述(转载加工基于CSDN黑莓专区)
  7. MySQL批量更新数据总结
  8. 众筹网角色维护【异步请求】
  9. 每日英语!(2021-3-1)
  10. leetcode589