有n個柱子,每個柱子有乙個高度hi
h
i,每個柱子可以跳到它後面高度與它相差大於d的柱子(即|h
i−hj
|≥d |hi
−hj|
≥d
) 求最多可以跳多少個柱子an
si=m
ax(a
nsj+
1)(|
hi−h
j|>=d且
ja ns
i=ma
x(an
sj+1
)(|h
i−hj
|>=d且
j
因此建立一棵線段樹,節點表示高度為i的點
每次查詢到乙個數,an
sia ns
i等於1~hi
−dh i−
d和 hi
+dh i+
d中最大數的最大值+1
線段樹維護最大值和最大值是哪個點
#include
#include
using
namespace
std;
#define n 110000
long
long a[n],b[n],d,ans[n];
int h1[n],h2[n],n,m,h[n],mx=0,data[n],tot=0;
struct nodetree[4*n];
void build(int v,int l,int r)
int query(int v,int l,int r)
void update(int v)
void add(int v,int l,long
long x)
int mid=tree[v].l+tree[v].r>>1;
if(l<=mid) add(v<<1,l,x);
if(mid1|1,l,x);
update(v);
}int main()
build(1,1,m-1);
for(int i=1;i<=n;i++)printf("%d\n",ans[mx]);
int t=h[mx];data[++tot]=mx;
for(int i=mx-1;i>=1;i--)
}for(int i=tot;i>=1;i--) printf("%d ",data[i]);
return
0;}
cf 474E 線段樹 dp 離散化後二分查詢
題意 給你n個柱子,每個柱子都有乙個高度,你從第乙個柱子開始跳往後跳,後面的柱子要滿足 hi hj d才可以跳上去,問最多跳多少步,並且輸出一種跳法,從小到大輸出柱子號。思路 真肯定是個dp,而且思路很簡單 轉移方程 dp i max dp j 1,hi hj d 但是n的範圍是10 5,那麼你每次...
CF 19D Points 線段樹 平衡樹
在平面上進行三種操作 1 add x y 在平面上新增乙個點 x,y 2 remove x y 將平面上的點 x,y 刪除 3 find x y 在平面上尋找乙個點,使這個點的橫座標大於x,縱座標大於y,而且要求他的橫座標盡量小,如果有多個點滿足,則選取橫座標盡量小的前提下,縱座標最小的點。方法 將...
cf 1187D 逆序對(線段樹)
題意 給你兩個均有n個數的陣列,現在你可以對a陣列中的任意區間進行sort操作,問你在sort完之後能不能得到b陣列。做法 這個是真的想不到啊。想法2200分的題目,大概的意思就是,因為可以對其中的任意區間進行操作,等於是去找逆序對的樣子,for每個數,當前數字在原陣列位置前不能有更小的未被消去的值...