首先我們很容易看出是乙個dp
然後容易看出是資料結構優化dp
但是這個限制條件有點鬼畜:
abs(p[i]-p[j])/2<=(t[i]-t[j])
p[i]>p[j] ->
t[i]*2-p[i]>=t[j]*2-p[j]
p[i]
t[i]*2+p[i]>=t[j]*2+p[j]
這樣的話我只會樹套樹(後來想想帶修主席樹應該也行?)。。。。。信仰不夠去%題解
結果發現這兩個東西是可以放在一起的,也就是說如果滿足p[i]>p[j]和t[i]*2-p[i]>=t[j]*2-p[j]那t[i]*2+p[i]>=t[j]*2+p[j]也滿足(好像很顯然啊是我柿子畫得太醜看不出來嗎)
就成了水水的二維偏序了。。。
#include#include#include
#include
#include
#include
using
namespace
std;
int s[110000
];int lowbit(int x)
void change(int x,intk)}
int getmax(int
x)
return
ret;
}struct nodea[110000
];bool cmp(node n1,node n2)
int lslen,ls[110000
];int
main()
sort(a+1,a+n+1
,cmp);
sort(ls+1,ls+lslen+1
); lslen=unique(ls+1,ls+lslen+1)-ls-1
;
for(int i=1;i<=n;i++)
a[i].w2=lower_bound(ls+1,ls+lslen+1,a[i].w2)-ls;
for(int i=1;i<=n;i++)change(a[i].w2,getmax(a[i].w2)+a[i].v);
printf(
"%d\n
",getmax(lslen));
return0;
}
bzoj2131 免費的餡餅
智障一般的操作,拆絕對值都忘了。數學沒救了。最後貌似是用的幾何意義推出來的。轉移的條件是 t i t j 並且abs p i p j 2 t i t j 顯然前面那個可以不考慮。然後你把每個狀態看作乙個二維平面上的點nd i 2 t i p i 移向不難發現 nd i 能夠轉移的點就是y x,y x...
bzoj 2131 免費的餡餅
易得方程 f i max f j v i 條件是 t i 一共有 3 個條件,但是你發現如果滿足後面兩個條件,自然滿足第乙個條件.所以可以將問題轉化為乙個二位偏序問題,離線 樹狀陣列處理一下即可.code include define n 100007 define ll long long usi...
bzoj 2131 免費的餡餅
易得方程 f i max f j v i 條件是 t i 一共有 3 個條件,但是你發現如果滿足後面兩個條件,自然滿足第乙個條件.所以可以將問題轉化為乙個二位偏序問題,離線 樹狀陣列處理一下即可.code include define n 100007 define ll long long usi...