题目链接:BZOJ - 1058

题目分析

这道题看似是需要在序列中插入一些数字,但其实询问的内容只与相邻的元素有关。

那么我们只要对每个位置维护两个数 Ai, Bi, Ai 就是初始序列中 i 这个位置的数, Bi 是在 i 这个位置insert的最后一个数。

那么在 i insert一个数 Num 的时候,造成的影响就是使得 Bi 和 A(i+1) 不再相邻,同时使 Bi 与 Num, Num 与 A(i+1) 相邻。然后将 Bi 更新为 Num。

这样就只需要实现一个multiset的功能就可以了。可以手写平衡树,也可以使用STL,当然STL会慢许多。

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <map>
#include <set> using namespace std; const int MaxN = 500000 + 5, INF = 1000000015, MaxL = 25; int n, m, MSG;
int A[MaxN], B[MaxN]; char Str[MaxL]; multiset<int> S, S2;
multiset<int>::iterator It, It2; inline int gmax(int a, int b) {return a > b ? a : b;}
inline int gmin(int a, int b) {return a < b ? a : b;}
inline int Abs(int a) {return a < 0 ? -a : a;} void Before(int x)
{
It = S.lower_bound(x);
if (It == S.end())
{
It--;
MSG = gmin(MSG, x - *It);
return;
}
if (*It == x)
{
MSG = 0;
return;
}
if (It == S.begin()) return;
It--;
MSG = gmin(MSG, x - *It);
} void After(int x)
{
It = S.upper_bound(x);
if (It == S.end()) return;
MSG = gmin(MSG, *It - x);
} int main()
{
scanf("%d%d", &n, &m);
S.clear(); S2.clear();
for (int i = 1; i <= n; ++i)
{
scanf("%d", &A[i]);
B[i] = A[i];
S.insert(A[i]);
}
for (int i = 2; i <= n; ++i)
S2.insert(Abs(A[i] - A[i - 1]));
MSG = INF;
for (int i = 1; i <= n; ++i)
{
S.erase(S.find(A[i]));
Before(A[i]);
After(A[i]);
S.insert(A[i]);
}
int Pos, Num;
for (int i = 1; i <= m; ++i)
{
scanf("%s", Str + 1);
if (Str[1] == 'I')
{
scanf("%d%d", &Pos, &Num);
Before(Num);
After(Num);
S.insert(Num);
if (Pos == n)
{
B[Pos] = Num;
continue;
}
S2.erase(S2.find(Abs(A[Pos + 1] - B[Pos])));
S2.insert(Abs(Num - B[Pos]));
S2.insert(Abs(A[Pos + 1] - Num));
B[Pos] = Num;
}
else if (Str[5] == 'G')
{
It2 = S2.begin();
printf("%d\n", *It2);
}
else
{
printf("%d\n", MSG);
}
}
return 0;
}

  

[BZOJ 1058] [ZJOI2007] 报表统计 【平衡树】的更多相关文章

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

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

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

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

  3. bzoj 1058: [ZJOI2007]报表统计

    Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...

  4. BZOJ 1058: [ZJOI2007]报表统计 multiset + 卡常

    Code: #include<bits/stdc++.h> #define maxn 600000 #define inf 1000000000 using namespace std; ...

  5. bzoj 1058 [ZJOI2007]报表统计(set)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1058 [题意] 一个序列,提供插入,查询相邻最小差值,查询任意最小差值的操作. [思路 ...

  6. bzoj 1058: [ZJOI2007]报表统计【set】

    我想写FHQtreap的!是set自己跑进代码的!因为太好写了 是有点慢--洛谷上不吸氧会T一个点 就是,用一个set p维护所有点值,ans维护MIN_SORT_GAP的答案,每次insert一个点 ...

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

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

  8. 【BZOJ】1058: [ZJOI2007]报表统计(splay+set)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1058 当复习一下splay.... 做法很简单..... 观察得知每一次插入一个点只需要维护前后的绝 ...

  9. 1058: [ZJOI2007]报表统计 - BZOJ

    Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个非 ...

随机推荐

  1. VSS的运用小内容(针对于vs2008版本)(小的问题都是,仅供参考--只针对于菜鸟级的)

    自己开始接触vss 的时候有些小的习惯没有很好的养成,下面的有关VSS内容都是简单的迁入迁出的问题,(仅供参考) 1.文件的迁入迁出:(.txt..xlsx..doc) a:文件的覆盖问题: 对于文件 ...

  2. Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例

    前言 此示例为keepalived+nginx+tomcat的基础配置示例,某些特定配置此例中不会出现,在示例中会用到三个虚拟机:两个纯命令行用于模拟服务端配置,一个带桌面环境的用于模拟客户端访问,这 ...

  3. JavaScript判断数据类型总结

    最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断网页特效,在此做一个总结吧! 一.JS中的数据类型  1.数值型(Number):包 ...

  4. Hadoop书籍汇总

    <Hadoop实战>陆嘉恒 <Hadoop - The Definitive Guide>Tom White,中文版<Hadoop权威指南> <Hadoop技 ...

  5. Java GetAndPost

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  6. Java 中判断char 是否为空格 和空

    //判断是否char是否为空import java.util.*; public class test{ public static void main(String[] args){ String ...

  7. C#世界中的委托

    委托是C#最重要的特性之一,C#后面的所有特性基本都是建立在委托的基础上的. 1.C#委托是什么? 可以把C#的委托理解为函数的一个包装,它使得C#中的函数可以作为参数来被传递.如果你学过C++,可以 ...

  8. 新的博客已经启用,欢迎大家访问(402v.com)

    非常抱歉这个博客已经暂停更新,新的博客已经启用,欢迎大家访问(402v.com)!谢谢支持!

  9. php文件锁(转)

    bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...

  10. hibernate一些方法

    session.flush() 同步缓存与数据库数据 session.evict(obj) 关闭指定对象缓存 session.clear() 关闭所有缓存 iterator(会把数据放入缓存)  下次 ...