求助李超线段树
查看原帖
求助李超线段树
537046
大眼仔Happy楼主2022/8/16 20:30

rt,不知道哪里打挂了

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define db double
const int N=1e5,T=5e4;
const db eps=1e-12;
int n;
struct line
{
	db k,b;
	bool Is;
}tr[T<<2];
int O(db x,db y)
{
	if(x-y>eps)return 1;
	if(x-y<-eps)return -1;
	return 0;
}
db F(line a,int x){return a.k*x+a.b;}
void modify(int o,int l,int r,int ql,int qr,line k)
{
	if(ql<=l&&r<=qr)
	{
		if(!tr[o].Is)tr[o]=k,tr[o].Is=1;
		else if( O(F(k,l),F(tr[o],l))==1 && O(F(k,r),F(tr[o],r))==1)tr[o]=k;
		else if( !(O(F(k,l),F(tr[o],l))==-1 && O(F(k,r),F(tr[o],r))==-1) )
		{
			int mid=(l+r)/2;
			if(O(F(k,mid),F(tr[o],mid))==1)swap(k,tr[o]);
			if(O(abs(F(k,l)-F(tr[o],l)),abs(F(k,r)-F(tr[o],r)))==-1)modify(o<<1,l,mid,ql,qr,k);
			else modify(o<<1|1,mid+1,r,ql,qr,k);
		}
	}
	else 
	{
		int mid=(l+r)/2;
		if(ql<=mid)modify(o<<1,l,mid,ql,qr,k);
		if(mid<qr)modify(o<<1|1,mid+1,r,ql,qr,k);
	 } 
}
db query(int o,int l,int r,int x)
{
	if(l==r)
	{
		if(tr[o].Is)return F(tr[o],x);
		return 0;
	}
	else 
	{
		int mid=(l+r)/2;db ans=0;
		if(tr[o].Is)ans=F(tr[o],x);
		if(x<=mid)return max(ans,query(o<<1,l,mid,x));
		else return max(ans,query(o<<1|1,mid+1,r,x));
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		string op;cin>>op;
    	if (op=="Project") {
    		double s, p;
        	scanf("%lf%lf",&s,&p);
        	line now;now.k=p;now.b=s;
        	modify(1,1,T,1,T,now);
    	}
        else {
        	int x;
        	scanf("%d",&x);
        	printf("%d\n",int(query(1,1,T,x)/100));
    	}
	}
	return 0;
}

2022/8/16 20:30
加载中...