樹鏈剖分 維護凸線 Saber

2021-06-04 18:36:45 字數 1582 閱讀 8484

秋哥是saber控,每次saber都很難,但是還有兩種顏色的saber沒出。

有一棵 n 個點的樹,每個點有四個權值 x,y,p,q,給出 m 個詢問(a,b),假設 i,j 為 a 到

b 的路徑上的可以重合的兩個點,求(yi+qj)/(xi+pj)的最大值。

二分答案,就化出了(x,y)與(p,q)分開的式子,分別對此兩式求最大值判斷,用斜率的經典分析來看(x,y)

若有一k比i優,則

yk-ans*xk>=yi-ans*xi

yk-yi>=ans*(xk-xi)

(yk-yi)/(xk-xi)>=ans

因此維護乙個斜率單減的佇列,每次二分

#include #include #include const int oo=1073741819,maxn=100000;

const double eps=1e-3;

int t[2],rt[maxn],f[maxn],d[maxn],next[maxn],sora[maxn],tail[maxn],o[maxn],s1,ss,n,m,p[maxn],up[maxn],m1;

double sum[2],ans[2];

struct lisanb[65536];

struct roomu[2][300000];

struct infa[maxn];

inline double max(double x,double y)

struct seg

inline void ori(int l1,int r1,int l2,int r2)

if (h>r) r=0,h=1;else t[k]=r;

} inline double search(double x)

if (ll<=r) return max(u[k][ll-1].y-x*u[k][ll-1].x,u[k][ll].y-x*u[k][ll].x);

else return u[k][ll-1].y-x*u[k][ll-1].x;

}}c[2][65536];

inline void dfs(int x,int y,int dep)

} if (maxi!=0) o[x]=o[maxi];else o[x]=++s1;

}inline int cmp(const void *i,const void *j)

void ori()

for (i=1;i<=n;i++)

for (i=m1-1;i>=1;i--)

}void origin()

inline double ask(int k,int l,int r,double x)

return ans;

}inline void updata(int &l,double x)

inline int find(double x,int l,int r)

if (ans[0]+ans[1]>0) return 1;else return 0;

}inline void link(int x,int y)

inline int equ(double x,double y) {return ((y-x)>-eps)&&((y-x)

BZOJ4712 洪水 樹鏈剖分維護Dp

小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到 山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這 個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和...

BZOJ4712 洪水 樹鏈剖分維護Dp

小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到 山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這 個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和...

poj 2763(樹鏈剖分維護邊權模版題)

time limit 4000ms memory limit 65536k total submissions 16709 accepted 4561 description input output for each message a,print an integer x,the time re...