統計零點的鐘聲馬上就要敲響,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 6output1 2 3
4 3 3
1 2 3 -2
3 1 3
4 3 3
2 2 3 4
3 1 3
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 讓...