牛客練習賽56 D 小翔和泰拉瑞亞(線段樹)

2021-10-01 23:39:36 字數 2463 閱讀 7614

題目描述

小翔愛玩泰拉瑞亞 。

一天,他碰到了一幅地圖。這幅地圖可以分為n列,第i列的高度為hi,他認為這個地圖不好看,決定對它進行改造。

小翔又學會了m個魔法,實施第i個魔法可以使地圖的第li列到第ri列每一列的高度減少wi,每個魔法只能實施一次,魔法的區間可能相交或包含。

小翔認為,一幅地圖中最高的一列與最低的一列的高度差越大,這幅地圖就越美觀。

小翔可以選擇m個魔法中的任意一些魔法來實施,使得地圖盡量美觀。但是他不知道該如何選擇魔法,於是他找到了你。請你求出所有可行方案中,高度差的最大值。

對於100%的資料,滿足1≤n,m≤200000,-109≤hi≤109,1≤wi≤109,1≤li≤ri≤n。

輸入描述:

輸入檔案的第一行包含兩個整數n,m。

輸入的第二行包含n個整數,相鄰兩數間用乙個空格隔開,第i個整數為hi。

接下來的m行,每行包含3個整數,分別是li,ri,wi,相鄰兩數間用乙個空格隔開。

輸出描述:

一行乙個整數,表示高度差的最大值。

輸入3 3

7 -2 -10

1 3 4

3 3 4

1 2 8

輸出21

題意:有n個數和m個區間操作,每次區間操作會減少一定的值,問你最終n個數里的最大值-最小值的差的最大值是多少?

分析:顯然,一頓操作後最大值和最小值一定會在具體的某個位置,我們假設它在i位置,那麼所有區間包含了i的操作都會使這個最小值越來越小,有可能會改變最大值,但是最大值要麼一起減少,要麼不變,對最終答案並無影響。所以可以得出有用的區間就是包含了i位置的區間,但是需要注意對於其他沒有包含i的區間你要使用了之後將它變回原樣,否則會影響最大值(最大值和最小值就不會一起減少了)。於是,可以先列舉每個位置i,假設i位置就是最小值,維護區間最大值,更新答案即可。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e5+1;

ll h[maxn]

,ans=0;

vector<

int>l[maxn]

,r[maxn]

;struct nodetree[maxn<<2]

;struct cxks[maxn]

;bool

cmp(

const cxk &a,

const cxk &b)

void

pushup

(int x)

void

pushdown

(int x)

}void

build

(int x,

int l,

int r)

int mid=

(l+r)

>>1;

build

(x<<

1,l,mid)

;build

(x<<1|

1,mid+

1,r)

;pushup

(x);

}void

update

(int x,

int l,

int r,ll val)

pushdown

(x);

int mid=

(tree[x]

.l+tree[x]

.r)>>1;

if(r<=mid)

update

(x<<

1,l,r,val)

;else

if(l>mid)

update

(x<<1|

1,l,r,val)

;else

update

(x<<

1,l,mid,val)

,update

(x<<1|

1,mid+

1,r,val)

;pushup

(x);

}ll query

(int x,

int l,

int r,

int op)

pushdown

(x);

int mid=

(tree[x]

.l+tree[x]

.r)>>1;

if(r<=mid)

return

query

(x<<

1,l,r,op)

;else

if(l>mid)

return

query

(x<<1|

1,l,r,op)

;else

}int

main()

printf

("%lld\n"

,ans)

;}

牛客練習賽56D 小翔和泰拉瑞亞(線段樹 思維)

給定乙個n元素陣列,你有m個操作,每次操作可以選擇乙個區間 li,ri 將這個區間內的數減少vi,你可以選擇其中一些進行操作,問你最後可以得到的最大值與最小值的差是多少?因為每個操作是對於區間而言,我們不可能去遍歷每個區間,所以需要更好的策略。又因為題中說的是最大值與最小值的差,所以我們可以考慮固定...

小翔和泰拉瑞亞

題目描述 小翔愛玩泰拉瑞亞 一天,他碰到了一幅地圖。這幅地圖可以分為n列,第i列的高度為hi,他認為這個地圖不好看,決定對它進行改造。小翔又學會了m個魔法,實施第i個魔法可以使地圖的第li列到第ri列每一列的高度減少wi,每個魔法只能實施一次,魔法的區間可能相交或包含。小翔認為,一幅地圖中最高的一列...

牛客練習賽56 小魂和他的數列

題目鏈結 給出乙個數列,讓求長度為k的嚴格遞增子串行有多少個 怎麼做呢?顯然dp 這個是很好想的 for int i 1 i n i for int i 2 i m i 這個dp顯然tle 所以 當時沒有做出來。做到這裡不會做了。想不到怎麼優化。顯然在最裡面的那個迴圈的作用是字首和 小於a i 的位...