数据结构板子——splay

维护数列 https://www.acwing.com/problem/content/957/
线段树能写的splay都能写,不过splay常数较大。时间复杂度大概是线段树的三倍

#include<bits/stdc++.h>
using namespace std;
const int N = 500010,INF = 1e9;
int n,m;
struct Node
{int s[2],p,v;int rev,same;int size,sum,ms,ls,rs;void init(int _v,int _p)//初始化点{s[0] = s[1] = 0,p = _p,v = _v;rev = same = 0;size = 1,sum = ms = v;ls = rs = max(v,0);}
}tr[N];int root,nodes[N],tt;
int w[N];void pushup(int x)
{auto &u = tr[x], &l = tr[u.s[0]], &r = tr[u.s[1]];u.size = l.size + r.size + 1;u.sum = l.sum + r.sum + u.v;u.ls = max(l.ls, l.sum + u.v + r.ls);u.rs = max(r.rs, r.sum + u.v + l.rs);u.ms = max(max(l.ms, r.ms), l.rs + u.v + r.ls);
}void pushdown(int x)
{auto &u = tr[x], &l = tr[u.s[0]], &r = tr[u.s[1]];if (u.same){u.same = u.rev = 0;if (u.s[0]) l.same = 1, l.v = u.v, l.sum = l.v * l.size;if (u.s[1]) r.same = 1, r.v = u.v, r.sum = r.v * r.size;if (u.v > 0){if (u.s[0]) l.ms = l.ls = l.rs = l.sum;if (u.s[1]) r.ms = r.ls = r.rs = r.sum;}else{if (u.s[0]) l.ms = l.v, l.ls = l.rs = 0;if (u.s[1]) r.ms = r.v, r.ls = r.rs = 0;}}else if (u.rev){u.rev = 0, l.rev ^= 1, r.rev ^= 1;swap(l.ls, l.rs), swap(r.ls, r.rs);swap(l.s[0], l.s[1]), swap(r.s[0], r.s[1]);}
}
void rotate(int x)
{int y = tr[x].p,z = tr[y].p;int k = tr[y].s[1] == x;//看是y的哪个儿子tr[z].s[tr[z].s[1]==y] = x,tr[x].p = z;tr[y].s[k] = tr[x].s[k^1],tr[tr[x].s[k^1]].p = y;tr[x].s[k^1] = y,tr[y].p = x;pushup(y);pushup(x);
}
void splay(int x,int k)//转到k的下面
{while (tr[x].p!=k){int y = tr[x].p,z = tr[y].p;if (z!=k) if ((tr[y].s[1]==x)^(tr[z].s[1]==y)) rotate(x);//如果不是直线型,那么就转两次xelse rotate(y);rotate(x);}if (!k) root = x;//如果转到顶了
}
int get_k(int k)//第k大个数的坐标
{int u = root;while (u){pushdown(u);if (tr[tr[u].s[0]].size>=k) u = tr[u].s[0];else if (tr[tr[u].s[0]].size+1==k) return u;else k-=tr[tr[u].s[0]].size+1,u = tr[u].s[1];}
}
int build(int l,int r,int p)//模仿线段树建树
{int mid = l+r>>1;int u = nodes[tt--];tr[u].init(w[mid],p);if (l<mid) tr[u].s[0] = build(l,mid-1,u);if (r>mid) tr[u].s[1] = build(mid+1,r,u);pushup(u);return u;
}
void dfs(int u)
{if (tr[u].s[0]) dfs(tr[u].s[0]);if (tr[u].s[1]) dfs(tr[u].s[1]);nodes[ ++ tt ] = u;//删除回收机制
}
int main()
{for (int i = 1;i<N;i++) nodes[++tt] = i;scanf("%d%d",&n,&m);tr[0].ms = w[0] = w[n+1] = -INF;//哨兵for (int i = 1;i<=n;i++) scanf("%d",&w[i]);root = build(0,n+1,0);char op[20];while (m--){scanf("%s",op);if (!strcmp(op,"INSERT")){int posi,tot;scanf("%d%d",&posi,&tot);for (int i = 0;i<tot;i++) scanf("%d",&w[i]);int l = get_k(posi+1),r = get_k(posi+2);splay(l,0);splay(r,l);int u = build(0,tot-1,r);tr[r].s[0] = u;pushup(r);pushup(l);}else if (!strcmp(op,"DELETE")){int posi,tot;scanf("%d%d",&posi,&tot);int l = get_k(posi),r = get_k(posi+tot+1);splay(l,0),splay(r,l);dfs(tr[r].s[0]);tr[r].s[0] = 0;pushup(r);pushup(l);}else if (!strcmp(op,"MAKE-SAME")){int posi,tot,c;scanf("%d%d%d",&posi,&tot,&c);int l = get_k(posi),r = get_k(posi+tot+1);splay(l,0);splay(r,l);auto &son = tr[tr[r].s[0]];son.same = 1,son.v = c,son.sum = c * son.size;if (c>0) son.ms = son.ls = son.rs = son.sum;else son.ms = c,son.ls = son.rs = 0;pushup(r);pushup(l);}else if (!strcmp(op, "REVERSE")){int posi,tot;scanf("%d%d",&posi,&tot);int l = get_k(posi),r = get_k(posi+tot+1);splay(l,0);splay(r,l);auto &son = tr[tr[r].s[0]];son.rev^=1;swap(son.ls,son.rs);swap(son.s[0],son.s[1]);pushup(r);pushup(l);}else if (!strcmp(op, "GET-SUM")){int posi,tot;scanf("%d%d",&posi,&tot);int l = get_k(posi), r = get_k(posi + tot + 1);splay(l, 0), splay(r, l);printf("%d\n", tr[tr[r].s[0]].sum);}else printf("%d\n",tr[root].ms);}
}**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么让wegame适应屏幕大小_iOS的五大设计原则:统一化和适应化原则

昨天米醋跟大家分享了iOS的五大设计原则中凸显内容原则&#xff0c;那么今天我们继续来说说统一化原则和适应化原则。统一化原则统一化原则主要体现在视觉统一和交互统一两个方面。在视觉统一方面&#xff0c;要讲究字体、颜色和元素的统一性&#xff0c;标题字号的统一&#x…

23种设计模式之原型模式代码实例

原型模式就是利用一个克隆”原型“来产生新对象的一种模式&#xff0c; 克隆又分浅克隆与深克隆&#xff0c; 浅克隆&#xff1a;将一个对象复制后&#xff0c;基本数据类型的变量都会重新创建&#xff0c;而引用类型&#xff0c;指向的还是原对象所指向的。 深克隆&#xff1a…

图论模板——费用流(无法处理负环)

费用流 https://www.acwing.com/problem/content/2176/ //最大流的最小费用 #include<bits/stdc.h> using namespace std;const int N 5010, M 100010, INF 1e8;int n,m,S,T; int ne[M],e[M],f[M],w[M],h[N],idx; int q[N],d[N],pre[N],incf[N]; bool st[N];void add…

css调用外部字体

CSS中可以使用font-face属性即可实现调用任何外部等特殊字体。 font-face属性介绍及其实例&#xff1a; 对浏览器的支持&#xff1a; Firefox、Chrome、Safari 以及 Opera 支持 .ttf (True Type Fonts) 和 .otf (OpenType Fonts) 类型的字体。 Internet Explorer 9 支持新的 fo…

python注入点查找_sqlmap常用注入点检测爆破命令

1、检测注入点是否可用python sqlmap.py -u "url"2、从目标url爆破所有数据库名python sqlmap.py -u "url" --dbs3、从目标url爆破当前数据库名python sqlmap.py -u "url" --current-dbs4、列出数据库所有用户python sqlmap.py -u "url&quo…

python如何输入空行_在python中,如何在接受用户输入时跳过空行?

您得到的行为是预期的&#xff0c;请阅读input文档。在input([prompt])If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newli…

js层级选择框样式_【JavaWeb】85:jQuery的各种选择器

今天是刘小爱自学Java的第85天。感谢你的观看&#xff0c;谢谢你。话不多说&#xff0c;开始今天的学习&#xff1a;选择器的作用是什么&#xff1f;可以快速准确地定位我们所需要的标签。刚学CSS的时候&#xff0c;觉得CSS选择器也太多了吧&#xff0c;直到今天学了jQuery选择…

python的单例模式

单例模式(Singleton Pattern)&#xff0c;是一种软件设计模式&#xff0c;是类只能实例化一个对象&#xff0c; 目的是便于外界的访问&#xff0c;节约系统资源&#xff0c;如果希望系统中 只有一个对象可以访问&#xff0c;就用单例模式&#xff0c; 显然单例模式的要点有三个…

c语言自定义输出小数点位数_C语言中输出时怎样控制小数点后的位数,请举例说明......

控制2113小数位数就是通过输出格式说明符来规定的举例5261说明如下4102&#xff1a;1、float f13.1415926;2、float f21234.1415926;3、float f3124.1;4、printf("%3.4f",f1);//输出结果为&#xff1a;_ _ 3.1416(_表示空格1653)5、printf("%3.4f",f2);//输…

语言求圆周率近似值改错_新证明解决了如何求无理数的近似值

原文&#xff1a;Kevin Hartnett&#xff0c;QuantaMagazine日前&#xff0c;一份新鲜出炉的论文证明了近80年悬而未决的达芬-谢弗&#xff08;Duffin-Schaeffer&#xff09;猜想&#xff0c;让数轴上讳莫如深的部分再也不如表面看来那么遥不可及。达芬-谢弗猜想的证明完美解答…

python在不同层级目录import模块的方法

转自&#xff1a;https://www.cnblogs.com/luoye00/p/5223543.html 使用python进行程序编写时&#xff0c;经常会使用第三方模块包。这种包我们可以通过python setup install 进行安装后&#xff0c;通过import XXX或from XXX import yyy 进行导入。不过如果是自己遍写的依赖包…

谷歌翻译无法连接网络_window10无法连接网络

很多朋友都将电脑的系统升级到Win10&#xff0c;如果遇到了Win10系统无法连接网络该如何解决&#xff0c;下面就为大家介绍一下解决的方法。window10无法连接网络一、检查路由器1、重新启动(断电10秒钟) 无线路由器和猫(调制解调器)&#xff0c;有时候是路由器的故障&#xff1…

php: +1天, +3个月, strtotime(): +1 day, +3 month

php: 1天, 3个月, strtotime(): 1 day, 3 month 比如&#xff0c;我现在当前时间基础上1天&#xff1a; strtotime("1 day"); 比如我现在&#xff0c;2014-05-01时间上 3个月 $s strtotime("2014-05-01"); $d strtotime("3 month", $s); 转载…

获取弹出的窗口_Win7系统如何获取设置everyone权限的问题

一位win7之家系统的小伙伴&#xff0c;想要在电脑系统中获取everyone权限&#xff0c;但是不知道该怎么做&#xff0c;对于Win7电脑如何获取设置everyone权限这个问题&#xff0c;小编觉得我们可以在电脑的计算机中找到相关的磁盘&#xff0c;打开磁盘属性然后在安全选项中进行…

异步请求中jetty处理ServletRequestListener的坑

标题起得比较诡异&#xff0c;其实并不是坑&#xff0c;而是jetty似乎压根就没做对异步request的ServletRequestListener的特殊处理&#xff0c;如果文中有错误欢迎提出&#xff0c;可能自己有所疏漏了。 之前遇到了一个bug&#xff0c;在Listener中重写requestDestroyed清理资…

Maven国内镜像 Maven阿里云镜像

<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 转载于:https://www.cnblogs.com/a2b1/p/787…

华为h22h05服务器做raid_华为V5服务器 RAID控制卡(LSI SAS3008IR)

提供高速接口和模块LSI SAS3008IR的PCIe Core提供PCIe x8接口&#xff0c;每lane速率为8Gb/s&#xff0c;可以兼容x1、x2、x4配置&#xff1b;支持PCIe 3.0规格&#xff0c;兼容PCIe 2.x和PCIe 1.x。LSI SAS3008IR的SAS模块提供SAS功能&#xff0c;并定义支持的硬盘速率。LSI S…

通过tomcat日志定位错误

1、tomcat的安装路径下tomcat home下的common文件夹下的classes文件夹中创建log4j.properties文件&#xff0c;即 apache-tomcat-5.5.20\common\classes log4j.rootLoggerinfo,Console,Rlog4j.appender.Consoleorg.apache.log4j.ConsoleAppenderlog4j.appender.Console.layouto…

css加了固定定位就不显示内容_前端开发必备,学好”定位“向菜鸟说拜拜

众所周知&#xff0c;前端CSS中&#xff0c;盒模型、浮动、定位为必须掌握的三座大山。今天就来聊聊定位的那些事。定位是什么&#xff1f;先来看看哪些场景用到定位&#xff0c;如下图所示&#xff0c;凡是有盒子压住另一个盒子的地方都可定位&#xff0c;因为用浮动做不了&am…

vscode更换主题的插件_VScode 插件开发(三)主题

咱们上回书说道&#xff0c;安装完基础环境&#xff0c;我们要来玩自己的主题了1. 创建一个主题项目$ yo code选中 New Color Theme接下来照图中所选&#xff0c;完成项目创建(简单英语不做解释)打开项目如图2. 配置文件2.1 themes这个文件夹包含主题配置文件&#xff0c;可以新…