【模板】李超树
学了一波李超树,虽然还不太懂原理,但是有模板就很心安了。
回头补完题再回味一下李超树吧
题目链接 : https://www.lydsy.com/JudgeOnline/problem.php?id=1568
1 /************************************************************************* 2 > File Name: bzoj1568.cpp 3 # File Name: bzoj1568.cpp 4 # Author : xiaobuxie 5 # QQ : 760427180 6 # Email:760427180@qq.com 7 # Created Time: 2019年09月03日 星期二 18时22分07秒 8 ************************************************************************/ 9 10 #include<iostream> 11 #include<cstdio> 12 #include<map> 13 #include<cmath> 14 #include<cstring> 15 #include<set> 16 #include<queue> 17 #include<vector> 18 #include<algorithm> 19 using namespace std; 20 typedef long long ll; 21 #define inf 0x3f3f3f3f 22 #define pq priority_queue<int,vector<int>,greater<int> > 23 ll gcd(ll a,ll b){ 24 if(a<b) return gcd(b,a); 25 return b==0?a:gcd(b,a%b); 26 } 27 char s[10]; 28 int cnt=0; 29 const int N=1e5+8; 30 const int mx=5e4+9; 31 struct line{ 32 double k,b; 33 }a[N]; 34 int tr[mx<<2]; 35 double f(int id,int x){ 36 return a[id].k*(x-1)+a[id].b; 37 } 38 void change(int o,int l,int r,int id){ 39 if(l==r){ 40 if( (f(id,l) > f(tr[o],l) )) tr[o]=id; 41 return; 42 } 43 int m=(l+r)>>1; 44 if( a[tr[o]].k < a[id].k){ 45 if( f(id,m) > f(tr[o],m)){ 46 change(o<<1,l,m,tr[o]); 47 tr[o]=id; 48 } 49 else change(o<<1|1,m+1,r,id); 50 } 51 if( a[tr[o]].k > a[id].k){ 52 if( f(id,m) > f(tr[o],m) ){ 53 change(o<<1|1,m+1,r,tr[o]); 54 tr[o]=id; 55 } 56 else change(o<<1,l,m,id); 57 } 58 } 59 double query(int o,int l,int r,int x){ 60 if(l==r) return f(tr[o],x); 61 int m=(l+r)>>1; 62 if(x<=m) return max( f(tr[o],x), query(o<<1,l,m,x)); 63 else return max( f(tr[o],x), query(o<<1|1,m+1,r,x)); 64 } 65 66 int main(){ 67 int n; scanf("%d",&n); 68 for(int i=1;i<=n;++i){ 69 scanf("%s",s); 70 if(s[0]=='P'){ 71 ++cnt; 72 scanf("%lf%lf",&a[cnt].b,&a[cnt].k); 73 change(1,1,mx-10,cnt); 74 } 75 else{ 76 int x; scanf("%d",&x); 77 printf("%d\n",(int)(query(1,1,mx-10,x)/100)); 78 } 79 } 80 return 0; 81 }