題意:
怪物攻入了城鎮,防務長打算派出軍隊去迎擊,怪物有等級,軍隊也有等級.
乙個軍隊的等級需要大於等於怪物等級才能夠殺死怪物。
派出的每個軍隊只能和乙隻怪物作戰。
防務長與你商討如何應對怪物,給你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...