题意:传送门
题解:李超树板题,参考传送门
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50100;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct node{
double b,k;
bool did;
node(double _b=0,double _k=0,bool _did=false):b(_b),k(_k),did(_did){}
};
node seg[maxn<<2];
double Intersection(double k1,double b1,double k2,double b2)
{
return 1.0*(b2-b1)/(k1-k2);
}
void update(double k,double b,int l,int r,int rt){
if(!seg[rt].did) seg[rt].b=b,seg[rt].k=k,seg[rt].did=true;
else{
double f1=k*l+b,f2=seg[rt].k*l+seg[rt].b,f3=k*r+b,f4=seg[rt].k*r+seg[rt].b;
if(f1<=f2&&f3<=f4){
return ;
}else if(f1>=f2&&f3>=f4){
seg[rt].k=k,seg[rt].b=b;
}else{
int m=l+r>>1;
double len=Intersection(k,b,seg[rt].k,seg[rt].b);
if(f1>=f2){
if(len<=m){
update(k,b,lson);
}else{
update(seg[rt].k,seg[rt].b,rson);
seg[rt].k=k; seg[rt].b=b;
}
}
else{
if(len>m){
update(k,b,rson);
}else{
update(seg[rt].k,seg[rt].b,lson);
seg[rt].k=k; seg[rt].b=b;
}
}
}
}
}
double query(int x,int l,int r,int rt){
double ans=0;
if(seg[rt].did){
ans=max(ans,1.0*x*seg[rt].k+seg[rt].b);
}
if(l==r){
return ans;
}
int m=l+r>>1;
if(m>=x){
ans=max(ans,query(x,lson));
}else{
ans=max(ans,query(x,rson));
}
return ans;
}
int main(){
int m;
scanf("%d",&m);
while(m--){
char t[50];
scanf("%s",t);
if(t[0]=='P'){
double k,b;
scanf("%lf%lf",&b,&k);
update(k,b-k,1,50000,1);
}
else{
int x;
scanf("%d",&x);
printf("%d\n",(int)floor(query(x,1,50000,1)/100.0));
}
}
return 0;
}