題目鏈結:點我點我:-)
題目描述:
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 ...