bzoj 1058: [ZJOI2007]报表统计 (Treap)
生活随笔
收集整理的這篇文章主要介紹了
bzoj 1058: [ZJOI2007]报表统计 (Treap)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058
題面;
1058: [ZJOI2007]報表統計
Time Limit:?15 Sec??Memory Limit:?162 MBSubmit:?4740??Solved:?1568
[Submit][Status][Discuss]
Description
小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寫了一個程序,使 得程序可以自動完成這些操作,但是他發現對于一些大的報表他的程序運行得很慢,你能幫助他改進程序么?Input
第一行包含兩個整數N,M,分別表示原數列的長度以及操作的次數。第二行為N個整數,為初始序列。接下來 的M行每行一個操作,即“INSERT i k”,“MIN_GAP”,“MIN_SORT_GAP”中的一種(無多余空格或者空行)。Output
對于每一個“MIN_GAP”和“MIN_SORT_GAP”命令,輸出一行答案即可。
Sample Input
3 55 3 1
INSERT 2 9
MIN_SORT_GAP
INSERT 2 6
MIN_GAP
MIN_SORT_GAP
Sample Output
22
1
HINT
?
N , M ≤500000 對于所有的數據,序列內的整數不超過5*10^8。
思路很容易想,寫起來有點麻煩 實現代碼: #include<bits/stdc++.h> using namespace std; #define ll long long #define ls t[x].ch[0] #define rs t[x].ch[1] const int M = 1e6 + 10; const int inf = 1e9; int idx,rt,n,m,a[M]; vector<int>g[M]; priority_queue<int,vector<int>,greater<int> > q; map<int,int>vis; struct node{int ch[2],cnt,siz,val,rd; }t[M];void up(int x){t[x].siz = t[ls].siz + t[rs].siz + t[x].cnt; }void rotate(int &x,int d){int son = t[x].ch[d];t[x].ch[d] = t[son].ch[d^1];t[son].ch[d^1] = x; up(x); up(x = son); }void ins(int &x,int val){if(!x){x = ++idx;t[x].cnt = t[x].siz = 1;t[x].val = val; t[x].rd = rand();return ;}t[x].siz ++;if(t[x].val == val){t[x].cnt ++; return ;}int d = t[x].val < val;ins(t[x].ch[d],val);if(t[x].rd > t[t[x].ch[d]].rd) rotate(x,d); }int pre(int x,int val){if(!x) return -inf;if(t[x].val >= val) return pre(ls,val);return max(pre(rs,val),t[x].val); }int nex(int x,int val){if(!x) return inf;if(t[x].val <= val) return nex(rs,val);return min(nex(ls,val),t[x].val); }int main() {int x,y; char op[100];int mn = inf;scanf("%d%d",&n,&m);for(int i = 1;i <= n;i ++){scanf("%d",&a[i]);g[i].push_back(a[i]);if(i!=1){int x = pre(rt,a[i]+1);int y = nex(rt,a[i]);mn = min(mn,min(abs(x-a[i]),abs(y-a[i])));}ins(rt,a[i]);}for(int i = 2;i <= n;i ++){q.push(abs(a[i]-a[i-1]));}while(m --){scanf("%s",op);if(op[0] == 'I'){scanf("%d%d",&x,&y);g[x].push_back(y);int len = g[x].size();int a = pre(rt,y+1);int b = nex(rt,y);mn = min(mn,min(abs(a-y),abs(b-y)));ins(rt,y);q.push(abs(g[x][len-2]-y));if(x != n){vis[abs(g[x][len-2]-g[x+1][0])]++;q.push(abs(y-g[x+1][0]));}}else if(op[4]=='G'){while(!q.empty()){int num = q.top();if(!vis[num]) break;vis[num]--; q.pop();}printf("%d\n",q.top());}else if(op[4]=='S'){printf("%d\n",mn);}} }?
轉載于:https://www.cnblogs.com/kls123/p/10732788.html
總結
以上是生活随笔為你收集整理的bzoj 1058: [ZJOI2007]报表统计 (Treap)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postman参数化 接口响应数据获取符
- 下一篇: 《大道至简》阅读笔记二