題意不再贅述。第一眼就覺得是動態規劃。
設\(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來做這道題,這道題插入和刪除都是模板,但是題中還有乙個比價坑的地方就是工資的調整。但我做不到在平衡樹上修改點權。如果每乙個都去插入和刪除的複雜度顯然非常高。看了題解發現,可以維護乙個變數來記錄...