BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
Description
Input
Output
Sample Input
5 8 10 2
max 1 3
min 1 3
max 2 4
Sample Output
解题思路:
Splay维护插入,删除,区间统计答案。
极差最大值为区间最值差,最小值为相邻元素之差。
然后愉快地AC
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lll tr[spc].ch[0]
#define rrr tr[spc].ch[1]
#define ls ch[0]
#define rs ch[1]
const int N=;
struct trnt{
int ch[];
int fa;
int E;
int wgt;
int maxval;
int minval;
int abst;
int minab;
}tr[N];
int siz;
int root;
int n,m;
int energy[N];
char cmd[];
bool whc(int spc)
{
return tr[tr[spc].fa].rs==spc;
}
void pushup(int spc)
{
tr[spc].wgt=;
tr[spc].maxval=tr[spc].minval=tr[spc].E;
tr[spc].minab=tr[spc].abst;
if(lll)
{
tr[spc].wgt+=tr[lll].wgt;
tr[spc].maxval=std::max(tr[spc].maxval,tr[lll].maxval);
tr[spc].minval=std::min(tr[spc].minval,tr[lll].minval);
tr[spc].minab=std::min(tr[spc].minab,tr[lll].minab);
}
if(rrr)
{
tr[spc].wgt+=tr[rrr].wgt;
tr[spc].maxval=std::max(tr[spc].maxval,tr[rrr].maxval);
tr[spc].minval=std::min(tr[spc].minval,tr[rrr].minval);
tr[spc].minab=std::min(tr[spc].minab,tr[rrr].minab);
}
return ;
}
void rotate(int spc)
{
int f=tr[spc].fa;
bool k=whc(spc);
tr[f].ch[k]=tr[spc].ch[!k];
tr[spc].ch[!k]=f;
tr[tr[f].fa].ch[whc(f)]=spc;
tr[spc].fa=tr[f].fa;
tr[f].fa=spc;
tr[tr[f].ch[k]].fa=f;
pushup(f);
pushup(spc);
return ;
}
void splay(int spc,int f)
{
while(tr[spc].fa!=f)
{
int ft=tr[spc].fa;
if(tr[ft].fa==f)
{
rotate(spc);
break;
}
if(whc(spc)^whc(ft))
rotate(spc);
else
rotate(ft);
rotate(spc);
}
if(!f)
root=spc;
return ;
}
void Build(int l,int r,int &spc,int f)
{
if(l>r)
return ;
int mid=(l+r)>>;
spc=++siz;
tr[spc].fa=f;
tr[spc].E=energy[mid];
tr[spc].abst=std::abs(energy[mid]-energy[mid+]);
Build(l,mid-,lll,spc);
Build(mid+,r,rrr,spc);
pushup(spc);
return ;
}
int plc(int spc,int v)
{
if(tr[lll].wgt>=v)
return plc(lll,v);
if(tr[lll].wgt+==v)
return spc;
return plc(rrr,v-tr[lll].wgt-);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&energy[i]);
Build(,n+,root,);
while(m--)
{
int x,y;
scanf("%s",cmd+);
scanf("%d%d",&x,&y);
if(cmd[]=='i')
{
int spc1=plc(root,x+);
int spc2=plc(root,x+);
int spc=++siz;
splay(spc1,);
splay(spc2,root);
tr[spc1].abst=std::abs(tr[spc1].E-y);
tr[spc].abst=std::abs(tr[spc2].E-y);
tr[spc].fa=spc2;
tr[spc].E=y;
tr[spc2].ls=spc;
pushup(spc);
pushup(spc2);
pushup(root);
}else if(cmd[]=='e')
{
int spc1=plc(root,x),spc2=plc(root,x+);
splay(spc1,);
splay(spc2,root);
tr[spc1].abst=std::abs(y-tr[spc1].E);
int spc=++siz;
tr[spc].fa=tr[root].rs;
tr[spc].E=y;
tr[spc].abst=std::abs(y-tr[spc2].E);
tr[tr[root].rs].ls=spc;
pushup(spc);
pushup(spc2);
pushup(root);
}else if(cmd[]=='i')
{
int spc1=plc(root,x),spc2=plc(root,y+);
splay(spc1,);
splay(spc2,root);
int ans=tr[tr[tr[root].rs].ls].minab;
printf("%d\n",ans);
}else{
int spc1=plc(root,x),spc2=plc(root,y+);
splay(spc1,);
splay(spc2,root);
int ans=tr[tr[tr[root].rs].ls].maxval-tr[tr[tr[root].rs].ls].minval;
printf("%d\n",tr[tr[tr[root].rs].ls].maxval-tr[tr[tr[root].rs].ls].minval);
}
}
return ;
}
BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)的更多相关文章
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- BZOJ4864 BeiJing 2017 Wc神秘物质(splay)
splay维护区间最大值.最小值.相邻两数差的绝对值的最小值即可. #include<iostream> #include<cstdio> #include<cmath& ...
- [bzoj4864][BeiJing 2017 Wc]神秘物质
来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...
- BZOJ4864[BeiJing 2017 Wc]神秘物质——非旋转treap
题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始 ...
- BZOJ_4864_[BeiJing 2017 Wc]神秘物质_Splay
BZOJ4864_[BeiJing 2017 Wc]神秘物质_Splay Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )
这就是一道数据结构裸题啊,最大极差就是区间最大值减最小值,最小极差就是相邻两个数差的最小值.然后平衡树splay/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZ ...
- #4864. [BeiJing 2017 Wc]神秘物质 [FHQ Treap]
这题其实挺简单的,有个东西可能稍微难维护了一点点.. \(merge\ x\ e\) 当前第 \(x\) 个原子和第 \(x+1\) 个原子合并,得到能量为 \(e\) 的新原子: \(insert\ ...
- 【BZOJ4864】神秘物质 [Splay]
神秘物质 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input Sample Output 1 ...
随机推荐
- Tensorflow MNIST 数据集測试代码入门
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50614444 測试代码已上传至GitH ...
- 离散化求RECT1
本文转载至点击打开链接 #include<stdio.h> struct node{ int x1,y1,x2,y2,c; }; struct node s[1010]; int px[2 ...
- 【SICP练习】152 练习4.8
练习4-8 原文 Exercise 4.8. "Named let" is a variant of let that has the form (let <var> ...
- 如何卸载visualsvn for visual studio
新入职的公司,电脑上的visual studio已经安装了visualsvn 尝试在tools-->extensions and updates中卸载 但是uninstall按钮是被禁用掉的 谷 ...
- Unity(IoC)
一.什么是IoC? IoC(Inversion of Control,控制反转)又称“依赖注入”(Dependence Injection,DI). 控制反转就是创建对象的权利由开发人员控制,转为由容 ...
- POJ 1671 第二类斯特林数
思路: 递推出来斯特林数 求个和 if(i==j)f[i][j]=1; else f[i][j]=f[i-1][j-1]+f[i-1][j]*j; //By SiriusRen #include &l ...
- OpenGL编程逐步深入(四)Shaders
OpenGl 中的 Shader在一些中文书籍或资料中都被翻译为"着色器", 单从字面意思也看不出Shader到底是什么,Shader实际上就是一段代码,用于完成特定功能的一个模块 ...
- Android setBackgroundResource和setBackgroundDrawable和用法
两个方法的效果是一样,只是区别于效率! playBtn.setBackgroundResource(R.drawable.pause_selecor); 从上面可以看出来是从资源文件中获取drawab ...
- Semi-Prime(半素数)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2723 Semi-Prime Time Limit: 2 Seconds ...
- 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码
TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...