帶修改的區間維護最大斜率。
題面用線段樹區間維護斜率。
考慮如何向上合併。
左半段一定有貢獻。
如果左半段的最大斜率大於右半段,右半段無貢獻。
否則,如果在右半段中,
左邊大於左半段,則直接加上右邊符合條件的(總\(-\)左,因為右邊現有的是大於左邊的),遞迴考慮左邊;
否則,遞迴右邊。
這個玩意好像不能自然想出來。
#include#include#include#include#include#include#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int n=1e5+100;
int n,m,x,y;
struct seg
t[n<<2];
il int gi()
il int query(re int now,re int l,re int r,re double k)
il void modify(re int now,re int l,re int r,re int x,re int z)
re int mid=l+r>>1;
if(x<=mid) modify(now<<1,l,mid,x,z);
else modify(now<<1|1,mid+1,r,x,z);
t[now].mk=max(t[now<<1].mk,t[now<<1|1].mk);
t[now].s=t[now<<1].s+query(now<<1|1,mid+1,r,t[now<<1].mk);
}int main()
return 0;
}
Luogu4198 樓房重建
小 a 的樓房外有一大片施工工地,工地上有 n nn 棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小 a 在平面上 0,0 0,0 0,0 點的位置,第 i ii 棟樓房可以用一條連線...
Luogu 4198 樓房重建
bzoj 2957 挺妙的題。先把題目中的要求轉化為斜率,乙個點 x,y 可以看成 frac 這樣子我們要求的就變成了乙個區間內一定包含第乙個值的最長上公升序列。然後把這個序列開成線段樹,維護一下區間內的答案 res 和最大值 mx 顯然對於葉子結點有 mx a l res 1 mx 的更新非常簡單...
洛谷 4198 樓房重建
傳送門 在乙個二維平面上有 n nn 棟樓房,第 i ii 棟樓房可以用以 i,0 i,0 i,0 和 i,hi i,h i i,hi 為端點的線段表示,一開始所有的 hi 0h i 0 hi 0。有 m mm 次操作,每次可以修改乙個 h ih i hi 並且在每次修改之後查詢在 0,0 0,0 ...