C Present(二分 掃瞄線)

2022-05-15 01:42:37 字數 1386 閱讀 5094

題意: 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 的時間內判斷我們二分答案的可行性。首先肯定想到貪心,但是你會發現每乙個元素需要加的值不一樣,加了值以後影響的範圍也不一樣,並不好維護。因為涉及到區間修改,考慮使用線段樹。我們維護每一位置...