n個連續的盒子,每個盒子有高度h和價值v,選擇任意一點進入,且從任意一點出來,進入後只能從左向右走,且每次走到的盒子高度必須更高,可以跳過低的盒子
狀態轉移方程:dp[i]=max(dp[j])+v[i], (0<=jh[j])
用線段樹優化,尋找 j
#include "stdio.h"
#include "string.h"
#include "queue"
#include "algorithm"
using namespace std;
struct mark
b[100100],mark[100100];
struct data
data[400010];
bool cmp(mark a,mark b)
int main()
sort(b+1,b+1+n,cmp);
h=1;
mark[b[1].id].h=1;
mark[b[1].id].v=b[1].v;
for (i=2;i<=n;i++)
build(0,h,1);
updata(mark[1].h,mark[1].v,1);
ans=mark[1].v;
for (i=2;i<=n;i++)
printf("%d\n",ans);
}return 0;
}
hdu 3450 離散化 dp 線段樹優化
題意 給你一串長度為n的序列,給乙個d,要求找出有幾個子串行能夠滿足兩個相鄰的元素之間差值不超過d。思路 dp。定義dp i 表示以第i個為結束的滿足條件的子串行的個數。轉移方程 dp i i 1j 1 dp j 1 abs num i num j d 答案就是dp陣列的總和最後扣掉n就可以了。此時...
HDU 3333 線段樹 離散化
只查詢區間不同的數的和 思路好題 對查詢離線 不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 等價操作的轉換 離散化一下 include define mem a,b memset a,b,sizeof a define lson root 1 define rson ro...
HDU1199 離散化線段樹
題目大意 一段長度未知的線段,一種操作 a b c 表示區間 a,b 要塗的顏色,c w塗白色,c b塗黑色,問你最長的白色區間段時多長。解題思路 就快去南京邀請賽了,最近做題超沒狀態,cf rating一直掉,這麼簡單的線段樹離散化居然搞了我乙個晚上,糾結。開始用線段樹區間合併的方法做,wa到死,...