【Foreign】神秘物质 [Splay]

神秘物质

Time Limit: 10 Sec  Memory Limit: 256 MB

Description

Input

  

Output

  

Sample Input

  

Sample Output

  1
  2
  1
  5

HINT

  

Main idea

  每个点有一个权值,维护一个结构,支持合并相邻两点,删除单点,加入单点,查询区间子集极差的最大值和最小值。

Solution

  首先我们可以发现,区间子集极差的最大值显然就是整个区间的最大值-区间最小值,然后区间子集极差最小值只有相邻点的才会产生贡献

  那么我们用Splay来维护这个结构即可,维护一下子树最大值、子树最小值、子树邻差最小值即可。

Code

  1 #include<iostream>
  2 #include<string>
  3 #include<algorithm>
  4 #include<cstdio>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cmath>
  8 using namespace std;
  9 typedef long long s64;
 10
 11 const int ONE = 300005;
 12 const int INF = 2147483640;
 13
 14 int n,m;
 15 int x,y,a[ONE];
 16 int root,cnt;
 17 int lc[ONE],rc[ONE],fa[ONE];
 18 int size[ONE],val[ONE];
 19 int maxx[ONE],minn[ONE],del[ONE];
 20 int Ls[ONE],Rs[ONE];
 21 char ch[10];
 22
 23 inline int get()
 24 {
 25         int res=1,Q=1;  char c;
 26         while( (c=getchar())<48 || c>57)
 27         if(c==‘-‘)Q=-1;
 28         if(Q) res=c-48;
 29         while((c=getchar())>=48 && c<=57)
 30         res=res*10+c-48;
 31         return res*Q;
 32 }
 33
 34 void Up(int i)
 35 {
 36         size[i] = size[lc[i]] + size[rc[i]] + 1;
 37         maxx[i] = minn[i] = val[i];
 38         del[i] = INF;
 39         Ls[i] = Rs[i] = i;
 40         if(lc[i])
 41         {
 42             Ls[i] = Ls[lc[i]];
 43             maxx[i] = max(maxx[i], maxx[lc[i]]);
 44             minn[i] = min(minn[i], minn[lc[i]]);
 45             del[i] = min(del[i], del[lc[i]]);
 46             del[i] = min(del[i], abs( val[i]-val[Rs[lc[i]]] ) );
 47         }
 48         if(rc[i])
 49         {
 50             Rs[i] = Rs[rc[i]];
 51             maxx[i] = max(maxx[i], maxx[rc[i]]);
 52             minn[i] = min(minn[i], minn[rc[i]]);
 53             del[i] = min(del[i], del[rc[i]]);
 54             del[i] = min(del[i], abs( val[i]-val[Ls[rc[i]]] ) );
 55         }
 56 }
 57
 58 void Turn(int x)
 59 {
 60         int y = fa[x], z = fa[y];
 61         int b = x==lc[y] ? rc[x]:lc[x];
 62
 63         fa[y] = x;    fa[x] = z;
 64         if(b) fa[b] = y;
 65
 66         if(z)
 67         {
 68             if(y == lc[z]) lc[z] = x;
 69             else rc[z] = x;
 70         }
 71
 72         if(x==lc[y]) rc[x] = y,lc[y] = b;
 73         else lc[x] = y, rc[y] = b;
 74
 75         Up(y);    Up(x);
 76 }
 77
 78 void Splay(int x,int pos)
 79 {
 80         while(fa[x] != pos)
 81         {
 82             if(fa[fa[x]] != pos)
 83             {
 84                 if( (lc[fa[x]]==x) == (lc[fa[fa[x]]]==fa[x]) ) Turn(fa[x]);
 85                 else Turn(x);
 86             }
 87             Turn(x);
 88         }
 89         if(pos == 0) root = x;
 90 }
 91
 92 int Build(int i,int l,int r)
 93 {
 94         int mid = l+r >> 1;
 95         fa[mid] = i;
 96         if(l <= mid-1) lc[mid] = Build(mid, l,mid-1);
 97         if(mid+1 <= r) rc[mid] = Build(mid, mid+1,r);
 98         Up(mid);
 99         return mid;
100 }
101
102 int Getid(int num)
103 {
104         int i = root;
105         while(size[lc[i]] + 1 != num)
106         {
107             if(size[lc[i]] + 1 < num)
108                 num -= size[lc[i]] + 1,    i = rc[i];
109             else i = lc[i];
110         }
111         return i;
112 }
113
114 void Delete(int i)
115 {
116         int x = Getid(i);
117         Splay(x, 0);
118         int L = Rs[lc[x]];    Splay(L,0);
119         int R = Ls[rc[x]];    Splay(R,L);
120         lc[R] = 0;
121         Splay(R,0);
122 }
123
124 void Insert(int i,int Val)
125 {
126         int x = Getid(i);
127         Splay(x,0);
128         int R = Ls[rc[x]];    Splay(R,x);
129         val[++cnt] = Val; fa[cnt] = R; lc[R] = cnt;
130         Splay(cnt,0);
131 }
132
133 int main()
134 {
135         n=get();    m=get();
136         for(int i=1;i<=n;i++)
137             val[i+1] = get();
138         val[1] = val[n+2] = INF;
139
140         cnt = n+2;
141         root = n+3 >> 1;
142         Build(0,1,n+2);
143
144         while(m--)
145         {
146             scanf("%s",ch+1);    x=get();    y=get();
147             x++;
148
149             if(ch[3] == ‘r‘)
150             {
151                 Insert(x+1,y);
152                 Delete(x);    Delete(x);
153             }
154             if(ch[3] == ‘s‘)
155                 Insert(x,y);
156             if(ch[3] == ‘x‘)
157             {
158                 y++;
159                 x = Getid(x-1);    y = Getid(y+1);
160                 Splay(x,0);    Splay(y,x);
161                 printf("%d\n", maxx[lc[y]] - minn[lc[y]]);
162             }
163             if(ch[3] == ‘n‘)
164             {
165                 y++;
166                 x = Getid(x-1);    y = Getid(y+1);
167                 Splay(x,0);    Splay(y,x);
168                 printf("%d\n", del[lc[y]]);
169             }
170
171         }
172 }

时间: 2024-10-06 20:15:34

【Foreign】神秘物质 [Splay]的相关文章

【bzoj4864】[BeiJing 2017 Wc]神秘物质 Splay

原文地址:http://www.cnblogs.com/GXZlegend/p/6801631.html 题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始观测. 在精密仪器的视野下,构成陨石的每个原子都无比清晰. 小诚发现, 这些原子排成若干列, 每一列的结构具有高度相似性.于是,他决定对单独一列原子进行测量和测试.被选中的这列共有 N 个顺序排列

【bzoj4864】神秘物质

123 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int n,m,a[200010]; 6 namespace splay{ 7 #define lson(x) t[x].lc 8 #define rson(x) t[x].rc 9 #define fa(x) t[x].fa 10 struct tree{ 11 int lc,rc,fa;

bzoj4864: [BeiJing 2017 Wc]神秘物质

这道题维护区间极差的最小值 只有长度为二的区间有贡献 这个可以尝试画一下 自己想想 这样之后维护的值有 区间最小值 区间最大值 以及区间内长度为二的区间差的最小值 区间大小 点本身的值. 注意要看你维护的区间差在区间左点还是右点 这在查询min的时候很重要 剩下的自己看把 代码不算长的了 虽然有点慢 换成结构体应该会快很多 #include<cstdio> #include<cstring> #include<algorithm> using namespace std

#4864. [BeiJing 2017 Wc]神秘物质 [FHQ Treap]

这题其实挺简单的,有个东西可能稍微难维护了一点点.. \(merge\ x\ e\) 当前第 \(x\) 个原子和第 \(x+1\) 个原子合并,得到能量为 \(e\) 的新原子: \(insert\ x\ e\) 在当前第 \(x\) 个原子和第 \(x+1\) 个原子之间插入一个能量为 \(e\) 的新原子. \(max\ x\ y\) 当前第 \(x\) 到第 \(y\) 个原子之间的任意子区间中区间极差的最大值: \(min\ x\ y\) 当前第 \(x\) 到第 \(y\) 个原子之

精子活力

二.引起精子活力低下的病因较多.归纳起来主要有以下几类是引起男子不育症的重要原因之一: 1.精索静脉曲张:由于精索静脉曲张导致毒性代谢产物CO2.类固醇.儿茶酚胺或前列腺素增多,到达睾丸而产生不良影响.同时睾丸局部瘀血,气血平衡失调,使精子形态及活动力受到影响. 2.生殖道感染:前列腺炎及精囊炎可影响到精液质量.其它如解脲支原体的感染及全身感染性疾病也可造成精子活力低下的发生. 3.理化因素的影响:药物.有机溶剂.烟酒.阴囊过热及环境污染,如:放射性.重金属.杀虫剂.化学毒物等,都可以引起精子活

学术会议高手速成之七种武器

学术江湖,虽无刀光剑影,却有血雨腥风.博士路上,漫漫修远,切磋技艺印证武功街头火拼胡同拍砖,大小战役,不可计数.一年数度之大型学术会议,更是群雄争锋之处华山论剑之时.回首五年江湖,西窗残阳似血,不胜唏嘘.暗观镜中博士帽上缨穗,犹感血迹斑斓,森然欲滴.遂决意退隐江湖葬剑青山,立志面朝大海春暖花开,再不过问学术界的是非恩怨.此五年心智武功,尽录于此,拳拳之心,皆为君故,诸位好生研习修炼,笑傲江湖之日,长歌烈酒,勿忘相邀.  第一种武器 长生剑 如果你想要一种最安全的武器闯荡江湖,你需要的是一把剑.连

中华神草新零售野山参的功效

野山参--凭什么被称作"神草"?野山参在2000多年前的<神农本草经>中就有记载,"主补五脏,安精神,定魂魄,止惊悸,除邪气,明目,开心益智,久服轻身延年",更在<本草纲目>中被李时珍称为"神草",而在现代生活中,野山参也会经常被用作补元气,安精神的良药.野山参不仅有补虚救脱.大补元气的功效,能强精健身益寿延年.服用野山参的好处:1.提高工作思维能力.减少疲劳野山参中皂苷 Rg1 能够兴奋中枢神经,加强大脑皮层的兴奋程度,

【BZOJ3786】星系探索 DFS序+Splay

[BZOJ3786]星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系具有传递性,即若星球a依赖星球b,星球b依赖星球c,则有星球a依赖星球c. 对于这个神秘的星系中,小C初步探究了它的性质,发现星球之间的依赖关系是无环的.并且从星球a出发只

神秘花园

一个孩子远离了人群,走到一个神秘的花园.就那么一瞬间,他被深深地吸引,人群中的嘈杂渐渐朦胧,远去,像是梦里一般......他开始忘却周围的一切,专注得像是刚来到这个世界.他用眼睛,用鼻子,用耳朵,用一切上帝赐予他的知觉力去感受花园里的一切.每一棵草,每一朵花,每一声鸟儿的啼叫,每一缕清风,每一朵云......仿佛自己融入其中,化为一体.他开始有所感悟:什么是真正的快乐,什么是真正的爱,我如何能得到?是我所能感受到的美好的万物吗? 与此同时,上帝正路过人间,感受到了孩子的心声,他惊诧是什么样的一颗