ZJOI 2007 報表統計(multiset)

2021-07-26 09:16:40 字數 2394 閱讀 2243

題目鏈結:點我點我:-)

題目描述

q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。

經過仔細觀察,小q發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。

在最開始的時候,有乙個長度為n的整數序列,並且有以下三種操作:

insert i k:在原數列的第i個元素後面新增乙個新元素k;如果原數列的第i個元素已經新增了若干元素,則新增在這些元素的最後(見下面的例子)

min_gap:查詢相鄰兩個元素的之間差值(絕對值)的最小值

min_sort_gap:查詢所有元素中最接近的兩個元素的差值(絕對值)

例如一開始的序列為

5 3 1

執行操作insert 2 9將得到:

5 3 9 1

此時min_gap為2,min_sort_gap為2。

再執行操作insert 2 6將得到:

5 3 9 6 1

注意這個時候原序列的第2個元素後面已經新增了乙個9,此時新增的6應加在9的後面。這個時候min_gap為2,min_sort_gap為1。

於是小q寫了乙個程式,使得程式可以自動完成這些操作,但是他發現對於一些大的報表他的程式執行得很慢,你能幫助他改進程式麼?

輸入輸出格式

輸入格式

第一行包含兩個整數n,m,分別表示原數列的長度以及操作的次數。

第二行為n個整數,為初始序列。

接下來的m行每行乙個操作,即「insert i k」,「min_gap」,「min_sort_gap」中的一種(無多餘空格或者空行)。

輸出格式

對於每乙個「min_gap」和「min_sort_gap」命令,輸出一行答案即可。

思路

本題使用stl的可重集-multiset,用得很巧妙。

1.用front, end兩個陣列分別表示這個元素列的開頭和結尾

2.定義line表示當前的序列放在multiset裡面,定義cha表示所有相鄰元素的差值放在multiset裡面

3.第一問就對cha先erase再insert即可,erase時如果擦的是指標,不會擦掉與其同樣數值的元素

4.對於第二問維護乙個最小值,每次插入新元素後看在line中的前後相鄰的元素是什麼,跟新值

感想

自己先想的是splay,然後覺得太難寫了,寫之前去查題解,發現居然是stl的好題。。。先學習了!有時間再用splay做一遍

**

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define pb push_back

#define ite multiset::iterator

#define set(a, v) memset(a, v, sizeof(a))

#define for(i, a, b) for(int i = (a); i <= (int)(b); i++)

#define forr(i, a, b) for(int i = (a); i >= (int)(b); i--)

#define maxn (500000+5)

int r[maxn], front[maxn], end[maxn];

multiset

line, cha;

void read(int &x)

x = 0;

while(ch >= '0' && ch <= '9')

x *= bj;

}int main()

ite l;

int tomin = 1e9;

for(ite r=line.begin(); r!=line.end(); r++)

char op[20];

while(m--)

if(it != line.end())

it = cha.find(abs(front[bef+1]-end[bef]));

cha.erase(it);

cha.insert(abs(front[bef+1]-add)); cha.insert(abs(end[bef]-add));

end[bef] = add;

}else

}return

0;}

ZJOI2007 報表統計

不想描述了,心累。兩個操作分別用splay和線段樹來維護 全域性的差值最小直接用splay在插入的時候維護前驅後繼即可 相鄰最小差值我們可以這樣搞 首先 用線段樹維護相鄰的最小值 可以注意到插入元素的操作,如果是在乙個元素之後反覆插入,這些元素之間更新出來的最小值是不會發生改變的。只有元素與元素之間...

ZJOI2007 報表統計

在原數列第 i 個後面新增乙個新元素 k 如果原數列的第 i 個元素已經新增了若干元素,則新增在這些元素的最後。查詢相鄰兩個元素的差值的絕對值的最小值。查詢所有元素中一對元素的差值的絕對值的最小值。第乙個操作很好維護,若要在第 i 個元素後面插值,那麼實際需要插入的位置是 i s i 1 其中 s ...

ZJOI2007 報表統計

題解 一道不錯的模板題 對於第乙個詢問,只需維護乙個支援刪除的堆 方法1.再維護乙個堆,將刪除的數加入這個堆,每次取元素時判斷一下是否和另乙個堆相等 方法2.利用左偏樹可以刪除任意節點 太久不寫都忘了 當然也可以維護一顆平衡樹 對於第二個詢問,只需弄一顆平衡樹求它的前驅後繼就可以了 include ...