169 UR 11 元旦老人與數列

2021-07-25 21:51:06 字數 4380 閱讀 7680

統計零點的鐘聲馬上就要敲響,2016 年即將要拉開序幕,元旦老人輕手輕腳地來到了 xyz111 的床頭,準備把他的禮物裝進襪子裡。

然而,xyz111 居然根本沒有去睡覺!毫無防備的元旦老人落入了他的陷阱之中。

原來,xyz111 仰慕正義的元旦老人已經很久了,於是他決定把元旦老人抓來探♂討哲♂學(病嬌臉)。

在經過交涉之後,xyz111 答應,如果元旦老人能回答出他的一些問題,那麼就放他走:

最開始 xyz111 有兩個長度為 

n n

的完全相同的數列 

a a

和 bb

,接下來有 

m m

次操作,每一次操作都是以下的四種之一:

對於所有的 i∈

[l,r

] i∈[l,r]

,將 a

i ai

變成 ai

+cai+c

。對於所有的 i∈

[l,r

] i∈[l,r]

,將 a

i ai

變成 max(ai

,d) max(ai,d)

。對於所有的 i∈

[l,r

] i∈[l,r]

,詢問 ai

ai的最小值。

對於所有的 i∈

[l,r

] i∈[l,r]

,詢問 bi

bi的最小值。

在每一次操作結束之後,xyz111 都會進行一次更新:對於所有的 i∈

[1,n

] i∈[1,n]

,將 b

i bi

變成 min(bi

,ai)

min(bi,ai)

。然而留給元旦老人的時間已經所剩無幾了,情急之下,他決定向你尋求幫助:你能幫他回答 xyz111 的問題嗎。

第一行兩個數:n,

m n,m

。接下來一行 

n n

個數 ai

ai。(最開始 bi

bi=a

i ai

)接下來 

m m

行中,第 

i i

行第乙個數 ti

ti表示操作型別:若 t

i=1 ti=1

,則接下來三個整數 li

,ri,

cili,ri,ci

,表示操作一。若 t

i=2 ti=2

,則接下來三個整數 li

,ri,

dili,ri,di

,表示操作二。若 t

i=3 ti=3

,則接下來三個整數 li

,ri li,ri

,表示操作三。若 t

i=4 ti=4

,則接下來乙個整數 li

,ri li,ri

,表示操作四。

對於每個詢問操作,輸出一行表示答案。

input

3 6

1 2 3

4 3 3

1 2 3 -2

3 1 3

4 3 3

2 2 3 4

3 1 3

output
301

1

測試點編號

n n

的規模m m

的規模其他約定1n

≤3000

n≤3000m≤

3000

m≤30002n

≤100000

n≤100000m≤

100000

m≤100000

不存在操作二3n

≤500000

n≤500000m≤

500000

m≤5000004n

≤100000

n≤100000m≤

100000

m≤100000

資料隨機生成56

789n

≤500000

n≤500000m≤

500000

m≤50000010

對於所有資料,保證有 1≤

li≤r

i≤n,

−2000≤c

i≤2000

1≤li≤ri≤n,−2000≤ci≤2000

和 −109

≤ai,

di≤10

9 −109≤ai,di≤109

時間限制:2s

2s空間限制:

96mb

96mb

2016,好好做人。

簡明題意:

維護一列數,,支援:

1.區間加法 2.區間取max 3.詢問當前區間最小值 4.詢問歷史區間最小值

solution:

線段樹維護,每個區間的點分兩類,最小值和其它數,當區間加法被執行的時候,區間內所有數字相對大小不變,因此打上標記後離開即可

當區間取max被執行的時候,找到區間最小值嚴格小於d且次小值嚴格大於d的子區間,這樣,對於這些子區間,區間取max就等價於對區間最小值的 + 操作

最後,分別維護兩類標記的歷史最小修改,就可以回答詢問4了

顯然,最小值的標記只能下傳給子區間中最小值較小的那個

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 5e5 + 5;

const int t = 4;

const int inf = ~0u>>1;

int n,m,min[maxn*t],fr[maxn*t],sc[maxn*t],sa[maxn*t],sb[maxn*t],pa[maxn*t],pb[maxn*t];

int getint()

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

ret = ret*10 + ch - '0',ch = getchar();

return ret * a;

}void clear(int o)

void maintain(int o)

void work(int o,int son,bool flag)

void pushdown(int o,int l,int r)

int lc = (o<<1),rc = (o<<1|1);

if (fr[lc] < fr[rc]) work(o,lc,1),work(o,rc,0);

else if (fr[lc] > fr[rc]) work(o,lc,0),work(o,rc,1);

else work(o,lc,1),work(o,rc,1); clear(o);

}void build(int o,int l,int r)

int mid = (l + r) >> 1; clear(o);

build(o<<1,l,mid); build(o<<1|1,mid+1,r);

maintain(o);

}void plusontree(int o,int l,int r,int ml,int mr,int k)

int mid = (l + r) >> 1; pushdown(o,l,r);

if (ml <= mid) plusontree(o<<1,l,mid,ml,mr,k);

if (mr > mid) plusontree(o<<1|1,mid+1,r,ml,mr,k);

maintain(o);

}void maxontree(int o,int l,int r,int ml,int mr,int k)

int mid = (l + r) >> 1; pushdown(o,l,r);

if (ml <= mid) maxontree(o<<1,l,mid,ml,mr,k);

if (mr > mid) maxontree(o<<1|1,mid+1,r,ml,mr,k);

maintain(o);

}int query(int o,int l,int r,int ql,int qr,int typ)

int main()

return 0;

}

UOJ169 UR 11 元旦老人與數列

傳送門 考慮用 segment tree beats 那一套理論,維護區間最小值 mn 和嚴格次小值 se 那麼可以直接 mlog 2n 維護前三個操作 考慮維護歷史最小值,先維護歷史最小標記 寫了寫發現 max 那個修改不好操作 對於 max 操作來說,只會在 mn v 的時候打上標記 這就相當於...

uoj169 元旦老人與數列

題意 sol 線段樹.蜜汁tle了乙個點,不管了.抄snowmydream的,orz.線段樹需要維護以下奇奇怪怪的一堆東西.區間最小值及其lazy標記 區間嚴格次小值及其lazy標記 最小值 嚴格次小值lazy標記的字首和,歷史最小值 dalao的部落格說了一堆勢能之類的東西我也沒看懂.我是看 才明...

UOJ 52 UR 4 元旦雷射炮

題目大意 給你三個有序陣列,長度分別為 n a,n b,n c 且都不超過100000。陣列中的元素從0開始編號。現在互動庫給你三個函式get a i get b i get c i 分別可以返回 a i,b i,c i 現在要你編寫乙個函式query kth 告訴你 n a,n b,n c,k 讓...