P7302 NOI1998 免費的餡餅

2022-08-16 00:54:25 字數 1533 閱讀 2255

題意不再贅述。第一眼就覺得是動態規劃。

設\(f(i)\)表示接到第\(i\)個餡餅能夠得到的最大價值。由於乙個人每次最多只能移動一格。設上一次接到的餡餅在\(p_j\),當前要接的餡餅在\(p_i\),那麼,如果能同時接到餡餅\(i,j\),必要條件是:\(|p_i-p_j|\leq 2(t_i-t_j),t_i-t_j\ge0\)

因此,狀態轉移方程可以表示為:

\(f(i)=val(i)+\sum\limits_f(j)\)

\(val(i)\)是第\(i\)個餡餅的價值。

因為:\[|p_i-p_j|\leq 2(t_i-t_j)\iff \begin 2t_j-p_j\leq 2t_i-p_i \\ 2t_j+p_j\leq 2t_i-p_i\end

\]所以:

\[\displaystyle f(i)=val(i)+\sum\limits_f(j)

\]不難發現,上面的約束條件其實是乙個二維偏序。因此,可以用樹狀陣列/cdq分治等演算法和資料結構水過。由於我過於愚鈍,開始沒注意到二位偏序的關係,慘遭wa。

資料結構的具體做法是,先按照一維排序,然後再用資料結構維護第二維。

@pythoner713 巨佬強烈要求發**。

下面是動態開點線段樹的**(因為我懶得寫離散化)。

#includeusing namespace std;

const int maxn = 1e5 + 5;

inline int read()

while(ch >= '0' and ch <= '9') w = w*10 + ch - '0', ch = getchar();

return w*f;

}struct segmenttreet[maxn*30];

int tot;

void update(int p)

void insert(int &p, int l, int r, int x, int val)

int mid = (l+r)>>1;

if(x <= mid) insert(t[p].ls, l, mid, x, val);

else insert(t[p].rs, mid+1, r, x, val);

update(p);

}int ask(int p, int l, int r, int l, int r)

int mid = (l+r)>>1, val = 0;

if(l <= mid) val = max(val, ask(t[p].ls, l, mid, l, r));

if(r > mid) val = max(val, ask(t[p].rs, mid+1, r, l, r));

return val;

}struct pie

}pie[maxn];

int n, w;

signed main();

} sort(pie+1, pie+n+1);

for(int i=1; i<=n; i++)

cout

}

NOI1998 免費餡餅,膜一膜XYX大爺

免費餡餅 serkoi最新推出了一種叫做 免費餡餅 的遊戲 遊戲在乙個舞台上進行。舞台的寬度為w格,天幕的高度為h格,遊戲者佔一格。開始時遊戲者站在舞台的正 手裡拿著乙個托盤。下圖為天幕的高度為4格時某乙個時刻遊戲者接餡餅的情景。遊戲開始後,從舞台天幕頂端的格仔中不斷出現餡餅並垂直下落。遊戲者左右移...

P4408 NOI2003 樹的直徑

題意 傳送門 p4408 noi2003 逃學的小孩 題解設路徑 c,a c,a c,a 與路徑 a,b a,b a,b 的第乙個交點為 d dd,問題等價於從 a aa 出發,找到兩條路徑 a,b a,c a,b a,c a,b a,c 且滿足 dis t a,d d ist d,b dist a...

P1486 NOI2004 鬱悶的出納員

題目鏈結 這道題需要動態插入,刪除,求排名,看到這就想到了平衡樹。由於本人只會splay,所以就用splay來做這道題,這道題插入和刪除都是模板,但是題中還有乙個比價坑的地方就是工資的調整。但我做不到在平衡樹上修改點權。如果每乙個都去插入和刪除的複雜度顯然非常高。看了題解發現,可以維護乙個變數來記錄...