https://www.luogu.com.cn/record/90176501
有哪位大佬能帮忙解释一下吗(或者数据水了)
#include<bits/stdc++.h>
using namespace std;
int T;
char op[10];
const int N=5e4+10;
struct Func{
double k,b;
};
inline double calc(Func line,int x){
return line.k*x+line.b;
}
inline bool cover(Func x,Func y,int t){
return calc(x,t-1)<calc(y,t-1);
}
struct Node{
int l,r;
Func line;
}t[N<<2];
void build(int p,int l,int r){
t[p]={l,r,{0.0,0.0}};
if(l==r) return;
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
void insert(int p,Func x){
if(cover(t[p].line,x,t[p].l)&&cover(t[p].line,x,t[p].r)){
t[p].line=x;
return;
}
if(t[p].l==t[p].r) return;
int mid=t[p].l+t[p].r>>1;
if(cover(t[p].line,x,mid)) swap(x,t[p].line);
if(cover(t[p].line,x,t[p].l)) insert(p<<1,x);
if(cover(t[p].line,x,t[p].r)) insert(p<<1|1,x);
}
double query(int p,int x){
double ans;
if(t[p].l==t[p].r) return calc(t[p].line,x-1);
int mid=t[p].l+t[p].r>>1;
if(x<=mid) ans=query(p<<1,x);
else ans=query(p<<1|1,x);
ans=max(ans,calc(t[p].line,x-1));
return ans;//第一次交没打这行
}
int main(){
scanf("%d",&T);
build(1,1,N);
while(T--){
scanf("%s",op);
double k,b;
int t;
if(op[0]=='Q'){
scanf("%d",&t);
printf("%d\n",int(query(1,t)/100));
}
else{
scanf("%lf%lf",&b,&k);
insert(1,{k,b});
}
}
return 0;
}