題意: n盆花,澆k次水, 每次可使花高度 + 1, 每次可澆相鄰的w盆,ai 表示 i-th盆花 的高度 問:當澆完m次後,最矮的一盆花最高可以使多少?
解題思路: 二分 + 掃瞄線, 由於高度最高10e9 + 10e5 ,最小1, 然後在 這範圍內二分搜尋。
假設此時二分高度為 h=6, 每朵花初始高度依次如圖所標。首先給第一朵花澆水,當前高度為2,還需要澆4天,temp = temp + 4,temp=4,但這四天只能對1,2,3起作用,對4不起作用,所以c[4] = -4,表示前面累積天數有四天對花4不起作用。給第二朵花澆水時,temp=4,已經澆了四天,而他只需要兩天所以不用再澆,3也一樣,c[2+w]=c[5]=0, c[3+w] = c[6]=0, 到4時temp = 4, 先消除前面影響,temp += c[4], temp = 0. 所以還需再澆4天,temp = 4,依次往後推。。。最後看總共澆水天數與剩下天數相比較 判定該高度是否可行。
————————————————
#include#define endl '\n'using
namespace
std;
typedef
long
long
ll;typedef
double
db;typedef pair
pii;
typedef vector
vi;#define all(x) (x).begin(),(x).end()
#define de(a) cout<<#a<<" = "<#define dd(a) cout<<#a<<" = "<#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define inf 0x3f3f3f3f
const ll mod = 1e9+7
;const
int n = 2e5+20
;#define dep(i,a,b) for(int i=(a);i>=(b);i--)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define mes(p,b) memset(p,b,sizeof(p))
#define sz(x) int(x.size())
int n,m,w,a[n],l=inf,r=1e9+1e5;ll c[n];
bool check(int
x) }
return y>=0;}
intmain()
int ans=l;
while(l<=r)
cout
}
接水果 fruit 整體二分 掃瞄線
題目描述 風見幽香非常喜歡玩乙個叫做 osu 的遊戲,其中她最喜歡玩的模式就是接水果。由於她已經 dt fc 了 the big black,她覺得這個遊戲太簡單了,於是發明了乙個更加難的版本。首先有乙個地圖,是一棵由 n 個頂點 n 1 條邊組成的樹 例如圖 1 給出的樹包含 8 個頂點 7 條邊...
BZOJ4009 接水果(整體二分,掃瞄線)
為什麼這都是許可權題?洛谷真良心 看到這道題,感覺就是主席樹 整體二分之類的東西 因為要求第 k 大 但是,讀完題目之後,我們發現路徑之間的包含關係很不好搞 那麼,我們來畫畫圖 這是第一種情況,lc a不是u,v u,v 分別是乙個盤子的兩端 如果被乙個水果完全覆蓋,那麼,這個水果的兩端分別在u,v...
CF460CPresent(二分答案 線段樹)題解
思路 顯然,這題正著不太好推,那麼就考慮二分答案,有乙個很大的問題,我們需要在 o n log n 或者 o n 的時間內判斷我們二分答案的可行性。首先肯定想到貪心,但是你會發現每乙個元素需要加的值不一樣,加了值以後影響的範圍也不一樣,並不好維護。因為涉及到區間修改,考慮使用線段樹。我們維護每一位置...