小絕戀love 楓是乙個出納,經常需要做一些統計報表的工作。今天是絕戀love 楓的生日,小絕戀love 楓希望可以幫爸爸分擔一些工作,作為他的生日禮物之一。經過仔細觀察,小絕戀love 楓發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。在最開始的時候,有乙個長度為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。於是小絕戀love 楓寫了乙個程式,使得程式可以自動完成這些操作,但是他發現對於一些大的報表他的程式執行得很慢,你能幫助他改進程式麼?
第一行包含兩個整數n,m,分別表示原數列的長度以及操作的次數。
第二行為n 個整數,為初始序列。
接下來的m 行每行乙個操作,即「insert i k」,「min_gap」,「min_sort_gap」中的一種(無多餘空格或者空行)。
對於每乙個「min_gap」和「min_sort_gap」命令,輸出一行答案即可。
3 55 3 1
insert 2 9
min_sort_gap
insert 2 6
min_gap
min_sort_gap
221對於30% 的資料,n≤1000,m≤5000
對於100% 的資料,n,m≤50000
對於所有的資料,序列內的整數不超過5*10^8。
題解
一道顯而易見的資料結構題,在資料結構題裡幾乎算不用動腦子的那種。前後最小的一下子想到鋼哥講過的垃圾堆,維護兩個堆就可以實現有效答案的新增和刪除。原數列也可以用乙個副本陣列,只維護目前最靠前和最靠後的值(考試時忘了下乙個位置的開頭元素還需要記錄,炸了不少分)。但是整個序列中最相近的兩個元素,就有些犯難。明明知道就應該建個平衡樹找前驅後繼,尷尬的情況是平衡樹只打過treap,treap只打過兩道題,還是一兩周之前的事了,考場上打掛可能性極大。權衡了一下,還是拿了個陣列暴力排序,唯一的優化是如果最小值已經為0就不再改動。算上這道題平衡樹也只打過三道,簡直不能算做過題。書到用時方恨少,事非經過不知難,從第一次見到這句話到現在已經有些年了,理解倒是越來越深了= =。
#include#includelove#include
#include
#include
#include
using
namespace
std;
const
int sj=50010
;int
n,m,a[sj],a1,a2,mi,g,q,h,jq,hj,size,d[sj];
priority_queue
,greater >qi;
priority_queue
,greater >du;
char c[20
];struct
tree
t[sj];
int bj(int x,int
y)void lturn(int &x)
void rturn(int &x)
void query_pre(int k,int
x)
else
query_pre(t[k].l,x);
}void query_beh(int k,int
x)
else
query_beh(t[k].r,x);
}void cr(int &x,int
y)
if(t[x].v==y)
if(y>t[x].v)
if(y
}void
init()
}else mi=0
; }
memcpy(d,a,
sizeof
(a));
}}void
cl()
qi.push(abs(a2-d[a1]));
d[a1]=a2;
if(mi)
}else mi=0
; }
}if(c[4]=='g'
)
printf(
"%d\n
",qi.top());
}if(c[4]=='
s') printf("
%d\n
",mi);
}}int
main()
在cogs上看到了這題,交了一下re,發現資料範圍是十倍……調了陣列大小再交一遍,居然tle了!據說堆可能會炸掉,不得已又改成了線段樹。跑得確實快了,可是比堆難寫得多啊。差點上兩百行【抵制惡意縮行不良風氣,從我做起!
#include#includeform#include
#include
#include
using
namespace
std;
const
int sj=500010
;int
n,m,a[sj],a1,a2,mi,g,q,h,jq,hj,size,d[sj],last;
struct
xsxds[sj*8
];char c[20
];struct
tree
t[sj];
int bj(int x,int
y)void lturn(int &x)
void rturn(int &x)
void query_pre(int k,int
x)
else
query_pre(t[k].l,x);
}void query_beh(int k,int
x)
else
query_beh(t[k].r,x);
}void cr(int &x,int
y)
if(t[x].v==y)
if(y>t[x].v)
if(y
}void build(int x,int z,int
y)void update(int x,int z,int
y)
int mid=(xds[x].l+xds[x].r)>>1
;
if(z<=mid)
else
}void
init()
}else mi=0
; }
}memcpy(d,a,
sizeof
(a));
last=n-1;}
void
cl()
}else mi=0
; }
}if(c[4]=='
g') printf("
%d\n
",xds[1
].v);
if(c[4]=='
s') printf("
%d\n
",mi);
}}int
main()
線段樹 平衡樹(STL) 勤快的love 楓
時間限制 1 sec 記憶體限制 128 mb 小絕戀love 楓是乙個出納,經常需要做一些統計報表的工作。今天是絕戀love 楓的生日,小絕戀love 楓希望可以幫爸爸分擔一些工作,作為他的生日禮物之一。經過仔細觀察,小絕戀love 楓發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢...
love熱點我的時尚領地
為經銷商創造更多地盈利機會 並非常重視對消費者地售後服務.要求每個銷售終端認真對待消費者地每乙個資訊反饋細節.並及時反饋到總部.以期對自身管理或者生產環節提出更多地改進.更好地為市場服務 現代女性在追求名牌地同時.也不忘把身份帶入這個追風浪潮之中.服裝市場現在異常地火爆.隨著時代地發展.近年來發展迅...
LOVE2D android豎屏的問題
直接把androidmanifest.xml的activity裡修改 android screenorientation portrait 豎屏 或android screenorientation landscape 橫屏 即可,如果您不想這樣可以用下面的方法翻轉。觸屏方面可能需要進行調整才能夠正...