description
n柱磚,希望有連續k柱的高度是一樣的. 你可以選擇以下兩個動作 1:從某柱磚的頂端拿一塊磚出來,丟掉不要了.input2:從倉庫中拿出一塊磚,放到另一柱.倉庫無限大. 現在希望用最小次數的動作完成任務.
第一行給出n,k. (1 ≤ k ≤ n ≤ 100000), 下面n行,每行代表這柱磚的高度.0 ≤ hi ≤ 1000000output
最小的動作次數sample input
5 3sample 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...