【模板】李超树

学了一波李超树,虽然还不太懂原理,但是有模板就很心安了。

回头补完题再回味一下李超树吧

题目链接 : 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 }
View Code

 

posted @ 2019-09-03 19:02  小布鞋  阅读(289)  评论(0编辑  收藏  举报