洛谷传送门

主要思路大概也是差不多的,对于两种询问分别用线段树与平衡树来维护。

1.MIN_SORT_GAP:显然平衡树简单操作,来一发前驱、后继即可。

2.MIN_GAP:这一个我用的是线段树:可以注意到插入元素的操作,如果是在一个元素之后反复插入,这些元素之间更新出来的最小值是不会发生改变的。只有元素与元素之间会有不断的插入而导致最小值变大。所以用线段树单点修改+维护区间min值,相邻插入值(中间不会再出现新的数字)之间可以直接暴力维护。

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define INF 99999999999LL
#define maxn 2000000
#define int long long
int n, m, tot, M1 = INF, M2 = INF, a[maxn];
int b[maxn], root;
struct tree
{
int l, r, num;
}T[maxn]; struct node
{
int v, ch[], fa;
}P[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} struct Splay_Balanced_Tree
{
void rotate(int x)
{
int f = P[x].fa, gf = P[f].fa;
int k = x == P[f].ch[];
P[x].fa = gf;
if(gf) P[gf].ch[f == P[gf].ch[]] = x;
P[f].ch[k] = P[x].ch[k ^ ], P[P[x].ch[k ^ ]].fa = f;
P[f].fa = x, P[x].ch[k ^ ] = f;
} void Splay(int x, int goal)
{
while(P[x].fa != goal)
{
int f = P[x].fa, gf = P[f].fa;
if(gf != goal) (P[f].ch[] == x) ^ (P[gf].ch[] == f) ? rotate(x) : rotate(f);
rotate(x);
}
if(goal == ) root = x;
} void ins(int x)
{
int u = root, ff = ;
while(u && P[u].v != x)
{
ff = u;
u = P[u].ch[P[u].v < x];
}
if(!u)
{
u = ++ tot;
P[u].fa = ff;
if(ff) P[ff].ch[P[ff].v < x] = u;
P[u].v = x;
Splay(u, );
}
} void Find(int x)
{
int u = root;
if(!u) return;
while(P[u].v != x && P[u].ch[P[u].v < x]) u = P[u].ch[P[u].v < x];
Splay(u, );
} int next(int x, int k)
{
Find(x);
int u = root;
if(P[u].v == x) return P[u].v;
if((P[u].v < x && !k) || (P[u].v > x && k)) return P[u].v;
u = P[u].ch[k];
while(P[u].ch[k ^ ]) u = P[u].ch[k ^ ];
return P[u].v;
}
}SBT; struct Segament_Tree
{
void build(int p, int l, int r)
{
T[p].l = l, T[p].r = r;
if(l == r)
{
T[p].num = abs(a[l] - a[l - ]);
return;
}
int mid = (l + r) >> ;
build(p << , l, mid), build(p << | , mid + , r);
T[p].num = min(T[p << ].num, T[p << | ].num);
} void update(int p, int x, int num)
{
int mid = (T[p].l + T[p].r) >> ;
if(T[p].l == T[p].r)
{
T[p].num = num;
return;
}
if(x <= mid) update(p << , x, num);
else update(p << | , x, num);
T[p].num = min(T[p << ].num, T[p << | ].num);
}
}SGT; signed main()
{
n = read(), m = read();
SBT.ins(INF), SBT.ins(- INF);
a[] = a[n + ] = INF;
for(int i = ; i <= n; i ++)
{
a[i] = read();
if(i != )
{
int l = SBT.next(a[i], ), r = SBT.next(a[i], );
M2 = min(M2, min(abs(l - a[i]), abs(r - a[i])));
}
SBT.ins(a[i]);
b[i] = a[i];
}
SGT.build(, , n);
for(int i = ; i <= m; i ++)
{
string s;
cin >> s;
if(s[] == 'I')
{
int x = read(), y = read();
int l = SBT.next(y, ), r = SBT.next(y, );
M2 = min(M2, min(abs(l - y), abs(r - y)));
SBT.ins(y);
M1 = min(M1, abs(b[x] - y));
SGT.update(, x + , abs(a[x + ] - y));
b[x] = y;
}
else if(s[] == 'G') printf("%lld\n", min(M1, T[].num));
else printf("%lld\n", M2);
}
return ;
}

【题解】ZJOI2007报表统计的更多相关文章

  1. bzoj P1058 [ZJOI2007]报表统计——solution

    1058: [ZJOI2007]报表统计 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4099  Solved: 1390 [Submit][St ...

  2. 【BZOJ1058】[ZJOI2007]报表统计 STL

    [BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...

  3. bzoj1058: [ZJOI2007]报表统计

    set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...

  4. BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )

    这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...

  5. [补档][ZJOI2007] 报表统计

    [ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...

  6. BZOJ_1058_[ZJOI2007]报表统计_STL

    BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...

  7. bzoj 1058: [ZJOI2007]报表统计 (Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...

  8. 洛谷 P1110 [ZJOI2007]报表统计 解题报告

    P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...

  9. [ZJOI2007]报表统计(splay,堆)

    [ZJOI2007]报表统计(luogu) Description 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. ...

  10. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

随机推荐

  1. git merge最简洁

    一.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支 git checkout devgit pullgit checkout mastergit merge devgit p ...

  2. webpack4提升180%编译速度

    前言 对于现在的前端项目而言,编译发布几乎是必需操作,有的编译只需要几秒钟,快如闪电,有的却需要10分钟,甚至更多,慢如蜗牛.特别是线上热修复时,分秒必争,响应速度直接影响了用户体验,用户不会有耐心等 ...

  3. maven-坐标与依赖

    1.坐标-找到项目依赖的重要依据 <groupId>cmbc.com.cn</groupId> <artifactId>myapp</artifactId&g ...

  4. mysql新增和更新表从已有数据库里面获取的sql语句

    在mysql数据库从已有数据库表插入数据到另一表的sql例子 insert into c(`name`) select name from b; 在mysql数据库从已有数据库表更新数据到另一表的sq ...

  5. python基础之初识

    一. 计算机是什么 基本组成: 主板+cpu+内存 cpu: 主频, 核数(16) 内存:大小(8G, 16G, 32G) 型号: DDR3, DDR4, DDR5, 主频(海盗船,玩家国度) 显卡: ...

  6. CAS解扰小结

    1.每个ts数据包由:1.包头 2.包数据 包头有个字段 PID ,该字段指示包数据的类型.比如说: PID 为 0x0000 包数据的类型就是 PAT表 PID 为 0x0001 包数据的类型就是 ...

  7. 【Leetcode】647. Palindromic Substrings

    Description Given a string, your task is to count how many palindromic substrings in this string. Th ...

  8. 网站的robots.txt文件

    什么是robots.txt? robots.txt是一个纯文本文件,是爬虫抓取网站的时候要查看的第一个文件,一般位于网站的根目录下.robots.txt文件定义了爬虫在爬取该网站时存在的限制,哪些部分 ...

  9. Android应用开发中的夜间模式实现(一)

    前言 在应用开发中会经常遇到要求实现夜间模式或者主题切换具体例子如下,我会先讲解第一种方法. 夜间模式 知乎 网易新闻 沪江开心词场 Pocket 主题切换 腾讯QQ 新浪微博 我今天主要是详述第一种 ...

  10. 修改npm全局安装模式的路径

    由于npm全局模块的存放路径及cache的路径默认是放在C盘下,这样肯定会增加C盘的负担,那么如果需要修改其存放路径应该怎么做呢? 第一步:在nodejs安装目录(也可以指定其它目录)下创建”node ...