cf474e Pillars 線段樹優化dp

2021-08-17 20:46:26 字數 1248 閱讀 8543

有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每個數,當前數字在原陣列位置前不能有更小的未被消去的值...