題目描述
小翔愛玩泰拉瑞亞 。
一天,他碰到了一幅地圖。這幅地圖可以分為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新建地圖 建立地圖 由於我之前建立了乙個地圖,所以就會顯示乙個 廢話 這裡選擇地圖大小,不用我說了吧。選擇地圖大小 選擇地...