BZOJ 1058 ZJOI 2007 报表统计 平衡树

题目大意:给出一个序列,有几个操作,询问相邻两个数的差值的绝对值的最小值,排序后差值绝对值的最小值。

思路:简单用平衡树或者set水一下就行了。

我个沙茶最开始sort_min还用的set维护

CODE:

#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 500010
#define INF 0xf3f3f3f
using namespace std;

int cnt,asks;
int src[MAX],last[MAX];

multiset<int> sorted,list_min;
int sort_min = INF;
char s[20];

int main()
{
    cin >> cnt >> asks;
    for(int i = 1; i <= cnt; ++i)
        scanf("%d",&src[i]),last[i] = src[i],sorted.insert(src[i]);
    for(int i = 2; i <= cnt; ++i)
        list_min.insert(abs(src[i] - src[i - 1]));
    multiset<int>::iterator l;
    for(multiset<int>::iterator it = sorted.begin(); it != sorted.end(); ++it) {
        if(it != sorted.begin())
            sort_min = min(sort_min,abs(*it - *l));
        l = it;
    }
    for(int x,y,i = 1; i <= asks; ++i) {
        scanf("%s",s);
        if(s[0] == 'I') {
            scanf("%d%d",&x,&y);
            multiset<int>::iterator it = sorted.insert(y);
            it--,sort_min = min(sort_min,abs(y - *it)),it++;
            it++,sort_min = min(sort_min,abs(y - *it)),it--;
            it = list_min.find(abs(last[x] - src[x + 1]));
            list_min.erase(it);
            list_min.insert(abs(y - last[x]));
            list_min.insert(abs(src[x + 1] - y));
            last[x] = y;
        }
        else if(s[4] == 'S')    printf("%d\n",sort_min);
        else    printf("%d\n",*list_min.begin());
    }
    return 0;
}
时间: 2024-10-14 20:30:59

BZOJ 1058 ZJOI 2007 报表统计 平衡树的相关文章

【BZOJ 1058】 [ZJOI2007]报表统计

1058: [ZJOI2007]报表统计 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 2013  Solved: 708 [Submit][Status] Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个可能为负数的整数数列,并且进行一些查询操作.在最开始的时候,有一个长度为N的整数序列,并且有

[BZOJ 1057][ZJOI 2007]棋盘制作(最大全0/1子矩阵)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1057 这题好像很早之前就看到过...那时候我还只会玩脚丫子,做这题完全像SB一样,记得那时我做了一会就放弃了. 如今看到这题感觉好做多了,此题预处理很巧妙,我们看一个棋盘,它的所有黑点的行标奇偶性都相同,列标的奇偶性也都相同.白点一样. 于是我们就可以预处理下,对于所有行标和列标奇偶性相同的点,保持它们的颜色不变,奇偶性不相同的点,反转它们的颜色,于是预处理后,我们要找的矩形在整

BZOJ 1093 ZJOI 2007 最大半连通子图 强联通分量+拓扑图DP

题目大意:定义半连通图:图中任意两点之间可以单向到达.求一个图的最大半连通子图,和这个图最大半连通子图的个数. 思路:半连通图并不是一定要没有环..这题意让我理解的.. 其实想法什么的不难,想明白了也不难写.因为要保证半连通,所以要先处理出一个图的联通状况.先用Tarjan缩点得到DAG,在这个DAG上找到最长链的长度就是第一问的答案.第二问可以先找到所有f值等于答案的点,在这些点上反向记忆化搜索DP. 注意一个小地方,ans的初值是最大的scc的大小,如果是0的化会wa一个点. CODE: #

[BZOJ 1095] [ZJOI 2007]Hide 捉迷藏

在BZ上连续MLE n次后,终于A了. 自己YY的动态点分写法,思路还是很清楚的,但是比较卡内存. 用到了MAP导致复杂度比其他的代码多了一个log,看来需要去借鉴一下别人怎么写的. 1 /* 2 动态树分治 3 BZOJ1095 4 全局路径查询 5 单点修改,全局查询 6 */ 7 #include<cstdio> 8 #include<iostream> 9 #include<cstdlib> 10 #include<cstring> 11 #incl

BZOJ 1096 ZJOI 2007 仓库建设 斜率优化DP

题目大意:山坡上有一些仓库,下雨了,要把所有仓库中的东西转移出来,每转移一单位的东西走一个单位长度需要花费1,在i处建立一个仓库需要花费cost[i],求最小的花费. 思路:和小P的牧场好像啊... 记录两个前缀和,sum[i] = Σsrc[i] _sum[i] = Σsrc[i] * pos[i], 然后DP方程:f[i] = f[j] + (sum[i] - sum[j]) * pos[i] - _sum[i] + _sum[j] + cost[i] 注意转换long long 数据有可能

BZOJ 1060 ZJOI 2007 时态同步 树形DP

题目大意:给出一个有根树,树上的边有边权.现在可以将一个边的边权的值+1,要想使得根节点到所有叶子节点的距离相等,最少需要多少个+1操作. 思路:当只考虑以一个节点为根的子树的时候,就必须要保证这个根节点到所有这个子树中的叶子节点的距离相等,才能保证最终根节点到所有叶子节点的距离都相等.所以就深搜一次,对于每个节点求出到这个节点的最长距离,将所有其他的边加成这个最长距离,记录答案. 但是这样并不能AC,因为标称是错的,它没有开long long ,于是乎我们也要开int才能AC..-.- COD

BZOJ 1057 ZJOI 2007 棋盘制作 DP+悬线法

题目大意:给出一个由01形成的矩阵,问这个矩阵中最大面积的正方形和矩形,其中任意一个方块相邻的都是不同的格子. 思路:其实吧所有(i + j)&1的位置上的数字异或一下,就变成都是0或者都是1的最大正方形和矩形了.第一问就是水DP,第二问可以单调栈或者悬线.都很好写. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

[BZOJ 1058] [ZJOI2007] 报表统计 【平衡树】

题目链接: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的功能

BZOJ 1058 报表统计 (STL)

题解:数据结构的基本操作,用STL可以完美实现,就是比较慢…… #include <cstdio> #include <map> #include <set> #include <vector> #include <algorithm> const int MAXN=500005; const int INF=~0U>>1; using namespace std; int n,m; sets,tr; map<int, int&