推荐博客:https://blog.csdn.net/litble/article/details/81234303
题目链接:https://www.luogu.org/problem/P4254
题意:n条y=kx+b的直线,每次查询x处y值的最大值
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int n = 50000;
struct Tree{
double k, b;
}T[(n<<2)+5];
#define mid ((l+r)>>1)
#define ls (u<<1)
#define rs (u<<1|1)
void build(int u,int l,int r){
T[u].b = -1e18, T[u].k = 0.0;
if(l == r) return;
build(ls,l,mid); build(rs,mid+1,r);
}
void change(int u,int l,int r,double K, double B){
double l1 = T[u].k*l+T[u].b, r1 = T[u].k*r+T[u].b;
double l2 = K*l+B, r2 = K*r+B;
if(l1<=l2 && r1<=r2){ T[u].k = K, T[u].b = B; return; }
if(l1>l2 && r1>r2) return;
double px = (B-T[u].b)/(T[u].k-K);
if(l2>l1){
if(px > mid) change(rs,mid+1,r,T[u].k,T[u].b), T[u].k = K, T[u].b = B;
else change(ls,l,mid,K,B);
}else{
if(px > mid) change(rs,mid+1,r,K,B);
else change(ls,l,mid,T[u].k,T[u].b), T[u].k = K, T[