「HNOI2002」营业额统计

传送门

这题比较板子吧应该。。。

有几个需要注意的地方:

  • 第一次插入时就要贡献答案
  • 在每次计算贡献时,注意分裂出来的子树是否为空,并且要对两边的相邻元素之差取 \(\min\)

参考代码:

#include <algorithm>
#include <cstdlib>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T & s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 1e5 + 5; int n, ans, rt, tot, siz[_], val[_], pri[_], ch[2][_]; inline int Newnode(int v)
{ return siz[++tot] = 1, val[tot] = v, pri[tot] = rand(), tot; } inline void pushup(int p) { siz[p] = siz[ch[0][p]] + siz[ch[1][p]] + 1; } inline int merge(int x, int y) {
if (!x || !y) return x + y;
if (pri[x] > pri[y])
return ch[1][x] = merge(ch[1][x], y), pushup(x), x;
else
return ch[0][y] = merge(x, ch[0][y]), pushup(y), y;
} inline void split(int p, int v, int& x, int& y) {
if (!p) { x = y = 0; return ; }
if (val[p] <= v)
return x = p, split(ch[1][p], v, ch[1][x], y), pushup(p);
else
return y = p, split(ch[0][p], v, x, ch[0][y]), pushup(p);
} inline int kth(int p, int k) {
if (siz[ch[0][p]] + 1 > k) return kth(ch[0][p], k);
if (siz[ch[0][p]] + 1 == k) return val[p];
if (siz[ch[0][p]] + 1 < k) return kth(ch[1][p], k - siz[ch[0][p]] - 1);
} int main() {
read(n), read(ans);
rt = merge(rt, Newnode(ans));
for (rg int x, a, b, i = 2; i <= n; ++i) {
read(x), split(rt, x, a, b);
int mn = 2147483647;
if (a != 0) mn = min(mn, x - kth(a, siz[a]));
if (b != 0) mn = min(mn, kth(b, 1) - x);
ans += mn, rt = merge(a, merge(Newnode(x), b));
}
printf("%d\n", ans);
return 0;
}

最新文章

  1. jsp中iframe填充装个页面
  2. 开源日志记录工具log4j
  3. CSS 栅格布局
  4. windows下php,redis配置
  5. Apache Jena - A Bootstrap
  6. Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象
  7. 数据类型转换的三种方式 Convert,parse和TryParse的解析
  8. enum 在c中的使用
  9. javascript读取本地文件
  10. Android 4.2 通知通过PendingIntent启动Activity失败的问题
  11. C++ 对象模型具体评论(特别easy理解力)
  12. 监控redis进程,如果没有自动重启
  13. 抛弃JQ,回归原生js……
  14. python写的一个集合
  15. SpriteBuilder全屏弹出菜单的特殊效果
  16. PAT 甲级真题题解(63-120)
  17. linux随机字符串
  18. 小米手机Toast显示带应用名称问题解决方法
  19. Sqlserver 2016 R Service环境安装的各种错误(坑)解决办法
  20. bzoj3029 守卫者的挑战 (多维dp)

热门文章

  1. 【代码学习】PYTHON 深拷贝和浅拷贝
  2. git拉取代码
  3. CSS选择器效率问题
  4. kettel路径配置
  5. easyapi用法
  6. About Computer Graphics 2.0
  7. 【笔记3-用户模块】从0开始 独立完成企业级Java电商网站开发(服务端)
  8. 基础_04_list and tuple
  9. Flask - app.debug=True,python manage.py和export FLASK_DEBUG=True,flask run的不同。
  10. 13 DFT变换的性质