李超线段树查询忘了return居然A了
查看原帖
李超线段树查询忘了return居然A了
609168
caojiashuo609168楼主2022/10/16 15:20

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;
}
2022/10/16 15:20
加载中...