[HNOI2002]营业额统计 II
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的更多相关文章
- BZOJ1588: [HNOI2002]营业额统计[BST]
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14151 Solved: 5366[Submit][Sta ...
- BZOJ 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14396 Solved: 5521[Submit][Sta ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- bzoj 1588: [HNOI2002]营业额统计 treap
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 13902 Solved: 5225[Submit][Sta ...
- 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12173 Solved: 4354[Submit][Sta ...
- bzoj1588 [HNOI2002]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 9203 Solved: 3097[Submit][Stat ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17555 Solved: 7179[Submit][Sta ...
随机推荐
- mysql优化limit
limit 1.当只需要一条数据的时候,用limit1: 2.当需要提高分页效率的时候: 如果用上面的语句分页少量数据还是可以用的,但是随着数据量越来越大,直接用limit语句查询速度就会越来越慢,降 ...
- 2019牛客多校九 I. KM and M (类欧几里得)
大意: 给定$N,M$, 求$\sum\limits_{K=1}^N \text{(KM)&M}$ 考虑第$i$位的贡献, 显然为$\lfloor\frac{KM}{2^i}\rfloor$为 ...
- 跟我一起学docker
一.认识 1.什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加 ...
- SQL 多并发 多人取号,防止重复取号SQL 办法
BEGIN TRAN SELECT * from 表明 WITH(HOLDLOCK) UPDATE 表名 SET 值=1 WHERE 字段=@carrierNo; ...
- .NET Framework 4安装问题
1.安装时,系统提示:运行此安装程序之前,必须安装 32 位 Windows 映像处理组件(WIC). http://www.microsoft.com/downloads/zh-cn/details ...
- C#-Parallel
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Li ...
- sqlserver2008+日志收缩sql语句命令
USE[master] GO ALTER DATABASE 数据库 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 数据库 SET RECOVER ...
- win10下,cmd,power shell设置默认编码为‘UTF-8
power shell 注:以下内容在非Windows平台上写的,可能会有拼写错误,如果有,请指正,我会尽快修正.可以用Powershell的配置文件(\(PROFILE)来实现.\)PROFILE默 ...
- charles 过滤指定域名
本文参考:charles 过滤指定域名 当使用"序列视图"的时候 请求多了有些时候会看不过来,Charles 提供了一个简单的 Filter 功能,可以输入关键字来快速筛选出 UR ...
- 软件测试_Loadrunner_性能测试_脚本优化_关联_手动关联
在写文章之前写一下自己的心路历程,录制脚本主要是上传图片并返回查询结果的过程.录制完脚本后发现函数中URl地址中有图片ID后台随机生成的32位随机数,并且每次上传图片id都会变化.我就上网搜索了一些解 ...