小蒟蒻求助,为啥BZOJ能过,洛谷WA前6个点
查看原帖
小蒟蒻求助,为啥BZOJ能过,洛谷WA前6个点
49174
starusc楼主2020/6/6 11:05

李超线段树

蒟蒻又双叒叕调不出来了,求助QwQ

//starusc
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return f==1?x:-x;
}
const int N=1e5+4;
#define lc (p<<1)
#define rc (p<<1|1)
int tfl[N<<2];
double tk[N<<2],tb[N<<2];
void modify(int p,int l,int r,double k,double b){
	if(!tfl[p]){tk[p]=k;tb[p]=b;tfl[p]=1;return;}
	double fpl=tk[p]*l+tb[p],fpr=tk[p]*r+tb[p];
	double fnl=k*l+b,fnr=k*r+b;
	if(fnl>=fpl&&fnr>=fpr){tk[p]=k;tb[p]=b;return;}
	if(fnl<=fpl&&fnr<=fpr)return;
	if(l==r)return;
	int mid=l+r>>1;
	if(fnl<fpl){
		if(tk[p]*mid+tb[p]<k*mid+b){
			modify(lc,l,mid,tk[p],tb[p]);
			tk[p]=k;tb[p]=b;
		}
		else modify(rc,mid+1,r,k,b);
	}
	else{
		if(tk[p]*mid+tb[p]<k*mid+b){
			modify(rc,mid+1,r,tk[p],tb[p]);
			tk[p]=k;tb[p]=b;
		}
		else modify(lc,l,mid,k,b);
	}
}
double query(int p,int l,int r,int x){
	if(!tfl[p])return 0;
	if(l==r)return tk[p]*x+tb[p];
	int mid=l+r>>1;
	if(x<=mid)return max(tk[p]*x+tb[p],query(lc,l,mid,x));
	else return max(tk[p]*x+tb[p],query(rc,mid+1,r,x));
}
char chh[20];
int main(){
	int n=read(),x;
	double s,p;
	for(int i=1;i<=n;i++){
		scanf("%s",chh);
		if(chh[0]=='P'){
			scanf("%lf%lf",&s,&p);
			s-=p;
			modify(1,1,n,p,s);
		}
		else{
			x=read();
			cout<<(long long)(query(1,1,n,x)/100)<<"\n";
		}
	} 
	return (0-0);
}
2020/6/6 11:05
加载中...