https://www.luogu.org/problemnew/show/2234

将权值离散化,以权值为下标建立权值线段树

#include <bits/stdc++.h>

using namespace std;
const int N = ;
const int oo = ; #define gc getchar()
#define lson jd << 1
#define rson jd << 1 | 1 struct Node_1 {int data, id;} A[N];
struct Node_2 {int l, r, w, Max, Min;} T[N << ];
int Ask[N], n, Answer, D[N], before, after; inline int read(){
int x = , f = ; char c = gc;
while(c < '' || c > '') {if(c == '-') f = -; c = gc;}
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x * f;
} bool cmp(Node_1 a, Node_1 b) {return a.data < b.data;} void pushup(int jd){
T[jd].w = T[lson].w + T[rson].w;
T[jd].Max = max(T[lson].Max, T[rson].Max);
T[jd].Min = min(T[lson].Min, T[rson].Min);
} void build_tree(int l, int r, int jd){
T[jd].l = l; T[jd].r = r; T[jd].Min = oo - ; T[jd].Max = -;
if(l == r) return ;
int mid = (l + r) >> ;
build_tree(l, mid, lson);
build_tree(mid + , r, rson);
} void Poi_G(int l, int r, int jd, int x){
if(l == r) {T[jd].w = ; T[jd].Max = l; T[jd].Min = l; return ;}
int mid = (l + r) >> ;
if(x <= mid) Poi_G(l, mid, lson, x);
else Poi_G(mid + , r, rson, x);
pushup(jd);
} void Sec_Min(int l, int r, int jd, int x, int y){
if(!T[jd].w) return ;
if(x <= l && r <= y) {after = min(after, T[jd].Min); return ;}
int mid = (l + r) >> ;
if(x <= mid) Sec_Min(l, mid, lson, x, y);
if(y > mid) Sec_Min(mid + , r, rson, x, y);
} void Sec_Max(int l, int r, int jd, int x, int y){
if(!T[jd].w) return ;
if(x <= l && r <= y)
{before = max(before, T[jd].Max); return ;}
int mid = (l + r) >> ;
if(x <= mid) Sec_Max(l, mid, lson, x, y);
if(y > mid) Sec_Max(mid + , r, rson, x, y);
} int main()
{
n = read();
for(int i = ; i <= n; i ++) {A[i].data = read(); A[i].id = i;}
sort(A + , A + n + , cmp);//按照权值进行排序
Ask[A[].id] = ; D[] = A[].data; int Id = ;//第i次访问的那个点在线段树中的位置
for(int i = ; i <= n; i ++){
if(A[i].data == A[i - ].data) continue ;
Ask[A[i].id] = Id; D[Id] = A[i].data;//线段树中位置对应的点的权值
Id ++;
}
Id --;
build_tree(, Id, );//建树
Answer += D[Ask[]];//第1次访问的点在线段树中的位置所对应的权值
Poi_G(, Id, , Ask[]);
for(int i = ; i <= n; i ++){
if(!Ask[i]) continue ;
before = - oo, after = oo;
Sec_Max(, Id, , , Ask[i]);
Sec_Min(, Id, , Ask[i] + , Id);
if(before == - oo) Answer += D[after] - D[Ask[i]];
else if(after == oo) Answer += D[Ask[i]] - D[before];
else Answer += min(abs(D[Ask[i]] - D[before]), abs(D[Ask[i]] - D[after]));
Poi_G(, Id, , Ask[i]);
}
cout << Answer;
return ;
}

[HNOI2002]营业额统计 II的更多相关文章

  1. BZOJ1588: [HNOI2002]营业额统计[BST]

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Sta ...

  2. BZOJ 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Sta ...

  3. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  4. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  5. bzoj 1588: [HNOI2002]营业额统计 treap

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13902  Solved: 5225[Submit][Sta ...

  6. 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12173  Solved: 4354[Submit][Sta ...

  7. bzoj1588 [HNOI2002]营业额统计(Treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 11485  Solved: 4062[Submit][Sta ...

  8. 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 9203  Solved: 3097[Submit][Stat ...

  9. 【链表】BZOJ1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 17555  Solved: 7179[Submit][Sta ...

随机推荐

  1. JQuery EasyUI框架

    1. JQuery EasyUI框架概述 1.1. JQuery EasyUI是什么东西 答:JQuery  EasyUI就是一套基础JQuery的富客户端的UI框架.像这些将常用的控件封装成一个UI ...

  2. win10 总是很快自动关机 无人参与系统睡眠超时设置

    解决WIN10隔几分钟就自动黑屏睡眠的方法!_Win10之家原文是卸载了电源驱动,下面是在评论里看到的方法: 这是系统无人值守时睡眠时间的设定,默认是两分钟.解决方法:1.运行注册表管理器,win+r ...

  3. vue进入页面时不在顶部,检测滚动返回顶部按钮

    这里是本小白使用时遇到的问题及个人使用的方法可能并不完美. 1.监测浏览器滚动条滚动事件及滚动距离 dmounted() { window.addEventListener("scroll& ...

  4. vue 做的tabBar组件

    效果如下 调用 <tabbar :selected='selected'></tabbar> 组件 <template> <div class='tabbar ...

  5. conda升级TensorFlow

    1.打开Anaconda prompt,查看tensorflow各个版本 anaconda search -t conda tensorflow 2.选择自己系统的版本:运行以下命令 anaconda ...

  6. HTML5 使用localstorage 本地存储

    HTML 本地存储介绍 最早的 Cookies 自然是大家都知道,问题主要就是太小,大概也就 4KB 的样子,而且 IE6 只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还 ...

  7. py-1 语言介绍

    一.编程与编程语言 1.编程的目的 计算机的发明,是为了用机器取代并解放人力.而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑.电脑一样自动执 ...

  8. MySql 学习之 一条更新sql的执行过程

    上一篇文章咱们说了一条查询sql的执行过程.如果没有看过上一篇文章的可以去看下上一篇文章,今天咱们说说一条更新sql的执行过程. 上面一条sql是将id为1的分数加上10. 那么它的执行流程是怎样的呢 ...

  9. Android面试题 描述一下android的系统架构

    android系统架构从下往上为linux内核层.运行库.应用程序框架层和应用程序层. Linux Kernel:负责硬件的驱动程序.网络.电源.系统安全以及内存管理等功能. Libraries和an ...

  10. uboot中setenv和saveenv分析

    转:https://blog.csdn.net/weixin_34355715/article/details/85751477 Env在u-boot中通常有两种存在方式,在永久性存储介质中(flas ...