E 怪獸來襲(思維,線段樹)

2021-10-09 07:55:24 字數 1674 閱讀 3819

題意:

怪物攻入了城鎮,防務長打算派出軍隊去迎擊,怪物有等級,軍隊也有等級.

乙個軍隊的等級需要大於等於怪物等級才能夠殺死怪物。

派出的每個軍隊只能和乙隻怪物作戰。

防務長與你商討如何應對怪物,給你q個詢問,詢問分為3種:

1.告訴你t時刻會來乙個等級為i的怪物;

2.告訴你t時刻會派出乙個等級為i的軍隊;

3.問你t時刻的時候(包含該時刻及該時刻以前已經派出的怪物和軍隊),以最優的方式部署軍隊與怪物作戰,是否還有怪物剩餘;

題目保證每個輸入的時間嚴格單調不減。

資料範圍:q<=1e6,等級i<=1e9

解法:

題目中的t是沒用的.

先離線離散化一下,

開一棵線段樹維護字首和

給怪物時就在[

1,i]加1

,給軍隊時就[

1,i]減1

,查詢的時候如果最大值<=

0則說明不存在怪物剩餘,輸出no,否則輸出yes

線段樹進行區間加法,維護區間max即可.

原理:假設給定怪物1和2

,軍隊3,[

1,1]

+1[1

,2]+

1[1,

3]-1

顯然每個軍隊會優先把小於等於自己且等級最高的消掉.

妙啊.

code:
#include

using

namespace std;

#define pi pair

const

int maxm=

2e6+5;

struct qqq[maxm]

;int q;

int b[maxm]

;struct tree

void

pushdown

(int node)

}void

update

(int st,

int ed,

int val,

int l,

int r,

int node)

pushdown

(node)

;int mid=

(l+r)/2

;if(st<=mid)

update

(st,ed,val,l,mid,node*2)

;if(ed>mid)

update

(st,ed,val,mid+

1,r,node*2+

1);pushup

(node);}

}t;signed

main()

}sort

(b+1

,b+1

+num)

; num=

unique

(b+1

,b+1

+num)

-b-1

;for

(int i=

1;i<=q;i++)}

for(

int i=

1;i<=q;i++

)else

if(q[i]

.p==2)

else

if(q[i]

.p==3)

else}}

return0;

}

思維 線段樹dp

不得不說這題是真的難,看題解都差點沒用理解。給定平面上若干 1e5 點,每個點ab兩個權值,要求將其分為兩組,a組的a權值和加b組的b權值和最大,劃分條件轉化一下就是,不能有a出現在b的右下,也就是要找到一條不降的折線,其上是a,其下是b。我們認為位於折線上的那些點屬於b。暴力dp是可做的,離散化x...

方塊 III 線段樹 思維

這題並不難,主要就是要想到,怎麼才可以做到將相同的數字給分開來,而方法就是將最開始出現的數字,和上乙個這個數字出現的位置之間,全部加上價值,而上乙個這樣的位置,減去價值。就這樣一直到n,最大的那個t 1 便是答案了,有點dp的感覺,但不是。include include include includ...

線段樹 思維題 樓房重建

小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上 0,0 點的位置,第i棟樓房可以用一條連線 i,0 和 i,hi 的線段表示,其中hi...