AT1251 家庭菜園

2022-05-24 13:15:08 字數 1944 閱讀 6732

注意!!! \(1-h_\) 和 \(h_-n\) 是可以有等於 \(h_i\) 的,翻譯錯了

洛谷傳送門

at傳送門

為什麼會有兩個たのしい

考慮最後能夠獲得收入的位置,這些位置構成乙個先上公升再下降的序列。

那麼我們可以列舉那個最高點,然後算出這個點左邊遞增的最大收入和右邊遞減的最大收入。

那麼只考慮左邊,右邊同理即可。

我們設 \(f_i\) 表示拔完某些草(也就是已經減去 \(c\) )之後,沒有比 \(i\) 更高的草,剩餘這些草的最大總收益。

那麼可以得到轉移方程:

\[f_i=\max\limits_ c_k\}+p_i

\]\(\sum\limits_c_k\) 表示 \(j\) 到 \(i\) 這段中,只需要刪去 \(h_k>h_i\) 的那一部分。

這樣的時間複雜度是 \(o(n^3)\) 的,所以需要優化。

因為 \(h_j\leq h_i,所以可以看作 \(h_k\) 對 \(h_j\) 有乙個 \(-c_k\) 的貢獻,進而 \(h_k\) 對所有 \(h_j的 \(j\) 的都有乙份貢獻,所以考慮以高度為下標開一顆線段樹,維護區間最大值。

具體操作:對於 \(i\) ,每次查詢 \(\max[0,h_i]\) ,可得 \(f_i=\max[0,h_i]+p_i\) ,然後拿 \(f_i\) 更新 \(h_i\) 位置,並對於 \([0,h_i-1]\) 減去 \(c_i\) 。

可以看出 \(\max[0,h_i]\) 就是轉移方程中的 \(\max\limits_ c_k\}\) 。因為當我們在操作 \(j\) 之後,每乙個 \(c_k(h_k>h_j)\) 我們都已經減去。那麼到了 \(i\) 的時候, \([0,h_i]\) 上的點就是我們要求的,這個時候查詢 \(\max\) 即可。

那這個題的大體思路就沒了。

小細節:因為 \(h_i\leq 10^9,n\leq 10^5\) ,所以如果以高度為下標建樹是不行的,記得離散化。

#include#define ll long long

#define ls rt<<1

#define rs rt<<1|1

using namespace std;

const int n=1e5+10;

const ll inf=1e18;

int n,h[n],p[n],c[n],buk[n],lsh;

ll f[n],g[n],mx[n<<2],lz[n<<2],ans;

inline int read()

while(isdigit(ch))

return x*f;

}void build(int rt,int l,int r)

inline void pushdown(int rt)

void update(int rt,int l,int r,int l,int r,ll v)

pushdown(rt);

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

if(l<=mid) update(ls,l,mid,l,r,v);

if(r>mid) update(rs,mid+1,r,l,r,v);

mx[rt]=max(mx[ls],mx[rs]);

}ll query(int rt,int l,int r,int l,int r)

void insert(int rt,int l,int r,int p,ll v)

pushdown(rt);

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

if(p<=mid) insert(ls,l,mid,p,v);

else insert(rs,mid+1,r,p,v);

mx[rt]=max(mx[ls],mx[rs]);

}inline void work(ll *f)

}int main()

1362 家庭問題 family

1 include2 using namespace std 3int n,k 按要求輸入 4int a,b 按要求輸入 5int rel 105 105 用於儲存各個成員之間的關係 6int vis 105 記錄是否被訪問過 7int que 10010 定義佇列 8int f,r 定義隊首隊尾 ...

L2 007 家庭房產

給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數 人均房產面積及房產套數。輸入格式 輸入第一行給出乙個正整數n 1000 隨後n行,每行按下列格式給出乙個人的房產 編號 父 母 k 孩子1 孩子k 房產套數 總面積 其中 編號 是每個人獨有的乙個4位數的編號 父 和 母 分別是該編...

PTA L2 007家庭房產

解體思路 利用並查集將所有家庭成員連線到乙個祖宗,連線的時候優先選擇將編號大的連線到編號小的,讓編號小的當祖宗。ac 1 include2 include3 include4 include5 include6 include7 include 8 include9 include10 includ...