【Splay】波动值之和(金牌导航 Splay-1)
波动值之和
金牌导航 Splay-1
题目大意
给出一个数列,求∑i=1nminj=1i−1∣ai−aj∣\sum_{i=1}^{n}min_{j=1}^{i-1}|a_i-a_j|∑i=1nminj=1i−1∣ai−aj∣
输入样例
6
5
1
2
5
4
6
输出样例
12
样例解释
5+∣1−5∣+∣2−1∣+∣5−5∣+∣4−5∣+∣6−5∣=5+4+1+0+1+1=125+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=125+∣1−5∣+∣2−1∣+∣5−5∣+∣4−5∣+∣6−5∣=5+4+1+0+1+1=12
数据范围
1⩽n⩽32767,∣ai∣⩽1061\leqslant n \leqslant 32767,|a_i|\leqslant 10^61⩽n⩽32767,∣ai∣⩽106
解题思路
用Splay存起来,然后每次找到最接近当前数的数(把当前数旋转为根节点,然后在左子树找最大,在右子树找最小)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 40000
using namespace std;
int n, x, w, rt, ans, s[N], ls[N], rs[N], fa[N];
int ss(int x)
{return x == ls[fa[x]];
}
void up(int x)
{int y = fa[x], z = fa[y], g = ss(x)? rs[x]: ls[x];if (z) ss(y)? ls[z] = x: rs[z] = x;if (ss(x)) rs[x] = y, ls[y] = g;else ls[x] = y, rs[y] = g;fa[x] = z;fa[y] = x;if (g) fa[g] = y;
}
void Splay(int x, int y)//旋转
{while(fa[x] != y){if (fa[fa[x]] != y)ss(x) == ss(fa[x])? up(fa[x]): up(x);up(x);}if (!y) rt = x;
}
void add(int v)//加点
{int x = rt, y = 0;while(x){y = x;if (v < s[x]) x = ls[x];else x = rs[x];}s[++w] = v;fa[w] = y;if (v < s[y]) ls[y] = w;else rs[y] = w;Splay(w, 0);
}
int ask()//查询
{int x = ls[rt], y = rs[rt], xx, yy;//分别查询左右子树if (x) while(rs[x]) x = rs[x];//左子树最大的if (y) while(ls[y]) y = ls[y];xx = s[rt] - s[x];yy = s[y] - s[rt];if (!x) return yy;if (!y) return xx;return min(xx, yy);
}
int main()
{scanf("%d", &n);scanf("%d", &ans);s[++w] = ans;rt = 1; while(--n){scanf("%d", &x);add(x);ans += ask();}printf("%d", ans);return 0;
}
【Splay】波动值之和(金牌导航 Splay-1)相关推荐
- 【Splay】文艺平衡树(金牌导航 Splay-2)
#文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列 输入样例 5 3 1 3 1 3 1 4 输出样例 4 3 2 1 5 数据范围 ...
- 【LCT】城市旅行(luogu 4842/金牌导航 LCT-3)
正题 luogu 4842 金牌导航 LCT-3 题目大意 给你一棵树,让你进行一些操作: 1.删除一条边 2.连接一条边 3.给一条路径上的点加上x 4.给出一条路径,在该路径选取两个点,求这两个点 ...
- 【luogu P4036】【ybt金牌导航4-5-3】火星人
火星人 题目链接:luogu P4036 / ybt金牌导航4-5-3 题目大意 给你一个字符串,要你维护三个东西. 修改字符串的一个字符,往字符串的一个地方插入一个字符,询问两个后缀的最长公共前缀. ...
- 【LCT】弹飞绵羊(luogu 3203/金牌导航 LCT-2)
正题 luogu 3203 金牌导航 LCT-2 题目大意 给你n个格子,当你在第i个格子时,可以往后跳aia_iai格,让你进行几下操作: 1.修改第i个数 2.查询在第i个格子跳多少下会跳出界 ...
- 【LCT】洞穴勘测(luogu 2147/金牌导航 LCT-1)
洞穴勘测 luogu 2147 金牌导航 LCT-1 题目大意 给你若干操作,有三种操作: 1.连接两个点 2.吧两个点之间的连边断掉(保证有这条边) 3.查询两个点之间是否连通 样例 #1 输入样例 ...
- 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)
正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti时在wiw_iwi出现(只出现一个单位时间),价值为sis_isi,当你t ...
- 【线性基】彩灯(luogu 3857/金牌导航 线性基-1)
彩灯 luogu 3857 金牌导航 线性基-1 题目大意 给若干个01串,让你选择其中一些,问你异或的值有多少种 输入样例 2 3 OO XO OX 输出样例 4 数据范围 1⩽N,M⩽501\le ...
- 【树链剖分】【线段树】树的统计(金牌导航 树链剖分-1)
树的统计 金牌导航 树链剖分-1 题目大意 给出一棵树,让你做若干操作,操作如下: 1.修改一个节点的值 2.查询两个节点之间路径的最大值 3.查询两个节点之间路径的和 输入样例 4 1 2 2 3 ...
- 【主席树】可持久化数组(金牌导航 可持久化数据结构-3)
可持久化数组 金牌导航 可持久化数据结构-3 题目大意 给出一个序列a,让你执行若干操作,操作分为两种: 1.继承第v次操作后把第x个数改成y 2.查询第v次操作的第x个数的值 输入样例 5 10 5 ...
最新文章
- git——从远程库克隆
- 不错!基于Springboot 2.0 + LayUI开发的物流管理系统(已开源)
- CTFshow php特性 web111
- IBM Rational AppScan使用详细说明
- PHP如何添加变量 $_SERVER
- python输出字体的大小_Toby的Python笔记 | 预备知识:安装openpyxl学做电子表格
- java B2B2C springmvc mybatis仿淘宝电子商城系统(十)用spring Restdocs创建API文档
- linux 管理 服务,Linux服务管理 详述
- React-Native的TextInput组件的设置以及获取输入框的内容
- Docker容器镜像删除不掉解决办法?
- 图示SaaS:走向平台化,会产生什么变化?
- blog转到CNBlog了
- dcs world f15c教学_高端DCS带电清洗用的什么清洗剂
- 怎样将手机屏幕投射到电脑
- Android 10 Settings应用二级菜单关于设备-Android版本中基带版本添加点击事件
- 【提供代码获取方式】matlab使用风羽法画大气环流
- 有了手机远程控制手机的软件,在家突然收到工作任务也不怕
- wire tox_Tox-rs的漫长旅程。 第1部分
- NAS入门之——My Cloud EX2+未入网的路由器局域网组网
- mysql数据库学习之sql调优思路
热门文章
- 陕西省计算机二级报名流程,计算机二级考试报名流程
- [PAT乙级]1001 害死人不偿命的(3n+1)猜想
- [蓝桥杯2015决赛]胡同门牌号-模拟+枚举
- 无法载入增效工具_山东省 智能工具箱 智能工具管理 工具管理企业数字化管理...
- python窗口显示表格_pyqt 调用tablewidget窗口时无法显示窗口内容
- Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈
- HDU2021多校第五天 1009 Array-树状数组求二阶前缀和
- CF1375G. Tree Modification(贪心,黑白染色)
- [ARC073C] Ball Coloring(贪心)
- CF626F. Bear and Fair Set