勤快的love楓 ZJOI2007

2022-02-03 10:14:39 字數 3916 閱讀 5352

小絕戀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 5

5 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#include

#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()

love

在cogs上看到了這題,交了一下re,發現資料範圍是十倍……調了陣列大小再交一遍,居然tle了!據說堆可能會炸掉,不得已又改成了線段樹。跑得確實快了,可是比堆難寫得多啊。差點上兩百行【抵制惡意縮行不良風氣,從我做起!

#include#include

#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()

form

線段樹 平衡樹(STL) 勤快的love 楓

時間限制 1 sec 記憶體限制 128 mb 小絕戀love 楓是乙個出納,經常需要做一些統計報表的工作。今天是絕戀love 楓的生日,小絕戀love 楓希望可以幫爸爸分擔一些工作,作為他的生日禮物之一。經過仔細觀察,小絕戀love 楓發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢...

love熱點我的時尚領地

為經銷商創造更多地盈利機會 並非常重視對消費者地售後服務.要求每個銷售終端認真對待消費者地每乙個資訊反饋細節.並及時反饋到總部.以期對自身管理或者生產環節提出更多地改進.更好地為市場服務 現代女性在追求名牌地同時.也不忘把身份帶入這個追風浪潮之中.服裝市場現在異常地火爆.隨著時代地發展.近年來發展迅...

LOVE2D android豎屏的問題

直接把androidmanifest.xml的activity裡修改 android screenorientation portrait 豎屏 或android screenorientation landscape 橫屏 即可,如果您不想這樣可以用下面的方法翻轉。觸屏方面可能需要進行調整才能夠正...