bzoj1112 樹狀陣列 磚塊Klo

2021-08-18 20:30:43 字數 1158 閱讀 7452

description

n柱磚,希望有連續k柱的高度是一樣的. 你可以選擇以下兩個動作 1:從某柱磚的頂端拿一塊磚出來,丟掉不要了.

2:從倉庫中拿出一塊磚,放到另一柱.倉庫無限大. 現在希望用最小次數的動作完成任務.

input

第一行給出n,k. (1 ≤ k ≤ n ≤ 100000), 下面n行,每行代表這柱磚的高度.0 ≤ hi ≤ 1000000

output

最小的動作次數

sample input

5 3

sample output

hint

原題還要求輸出結束狀態時,每柱磚的高度.本題略去.

題解

你可以發現其實就是對於連續一段,把這一段放到數軸上。然後在數軸上找到乙個點,使得這一段數到這個點的總距離最小

不難想到這個點其實就是中位數

於是我們可以列舉每一段,在樹狀陣列上二分找到這個數

然後就沒了。。

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

ll a[1110000],mmax;

int s[1110000],n,k;

int lowbit(int x)

void chs(int x,int c)}

void cha(int x,ll c)}

ll findsum(int x)return ret;}

int findall(int x)return ret;}

ll h[1110000];

int main()

printf("%lld\n",owb);

return

0;}

bzoj 1112 磚塊 中位數 set

首先乙個結論是選定的k個高度一定是他們的中位數,證明見白書p6 然後我們可以列舉每個區間,用set維護區間中位數。注意multiset的刪除操作是把所有這個值的都刪去。所以又用了乙個map 注意查詢時如果集合為空的處理 p黨是怎麼想的這道題?include include include inclu...

bzoj1246(樹狀陣列)

樹狀陣列的靈活運用,維護的是最大值,因為整個陣列就是乙個字首最大值,所以可以用實現,求乙個字首最大值,和更新pos之後的最大值。很好的運用,多回顧思考 include include include include includeusing namespace std const int n 200...

bzoj 2762 樹狀陣列

題意 給出一些形如 ax b 1 新加入乙個不等式 2 刪除乙個不等式 3 詢問當x k時滿足的不等式的個數 對於每乙個不等式,通過變形就可以得到使它成立的x的範圍 那麼就變成區間修改,單點查詢,樹狀陣列維護就好 注意 1 討論a 0 a 0 a 0的情況 2 由於k有非正數,所以要加上10 6 1...