小翔和泰拉瑞亞

2021-10-01 19:02:44 字數 2109 閱讀 4206

題目描述

小翔愛玩泰拉瑞亞 。

一天,他碰到了一幅地圖。這幅地圖可以分為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,相鄰兩數間用乙個空格隔開。

輸出描述:

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

示例1輸入

複製3 3

7 -2 -10

1 3 4

3 3 4

1 2 8

輸出複製

21應該能看出來,可能是用線段樹維護維護。但是不知道為什麼過的人這麼少qaq。

我們對於某個點 x ,x及其後面的點作為最小值時的答案。

我們分析可以得知,這樣是可以保證答案正確。然後對於影響x後面的操作,那麼直接執行,前面的就不執行了。

所以很明顯,我們去用vector存一下對於當前點x的操作,從1到n掃一遍即可。

超過x就撤銷操作。

ac**:

#include

#define int long long

using namespace std;

const

int n=

2e5+10;

int n,m,l[n]

,r[n]

,w[n]

,res;

vector<

int> v[n]

;struct nodet[n<<2]

;inline

void

push_up

(int p)

inline

void

push_down

(int p)

}void

build

(int p,

int l,

int r)

int mid=l+r>>1;

build

(p<<

1,l,mid)

;build

(p<<1|

1,mid+

1,r)

;push_up

(p);

}void

change

(int p,

int l,

int r,

int v)

push_down

(p);

int mid=t[p]

.l+t[p]

.r>>1;

if(r<=mid)

change

(p<<

1,l,r,v)

;else

if(l>mid)

change

(p<<1|

1,l,r,v)

;else

change

(p<<

1,l,mid,v)

,change

(p<<1|

1,mid+

1,r,v)

;push_up

(p);

}signed

main()

res=t[1]

.mx-t[1]

.mi;

for(

int i=

1;i<=n;i++

) res=

max(res,t[1]

.mx-t[1]

.mi);}

cout<'\n'

;return0;

}

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

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

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

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

搭建乙個泰拉瑞亞手機版伺服器

表示有人在群裡談到泰拉瑞亞了。於是我閒著沒事乾開了乙個伺服器。正好也可以水一篇文章 huaji 首先。我不了解這個遊戲 pc端到了1.3.5 mobile端才1.3.7 然後選n新建地圖 建立地圖 由於我之前建立了乙個地圖,所以就會顯示乙個 廢話 這裡選擇地圖大小,不用我說了吧。選擇地圖大小 選擇地...