【BZOJ】【P1568】【JSOI2008】【Blue Mary开公司】【题解】【线段树】

来源:互联网 发布:大数据专业结业论文 编辑:程序博客网 时间:2024/04/28 06:38

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1568

3165弱化版

Code:

#include<bits/stdc++.h>using namespace std;const int maxn=50001;int n=50000,m,ind;struct seg{double k,b;int id;seg(int x0=0,int y0=0,int x1=0,int y1=0,int _id=0){id=_id;if(x0==x1){k=0;b=max(y0,y1);}else{k=(double)(y0-y1)/(x0-x1);b=y0-k*x0;}}double get(double x){return k*x+b;}};bool les(seg A,seg B,double x){if(!A.id)return 1;return A.get(x)!=B.get(x)?A.get(x)<B.get(x):A.id<B.id;}struct sgt{seg t[maxn<<2];seg Qmax(int i,int l,int r,int ps){if(l==r)return t[i];seg tmp;if(ps<=(l+r)/2)tmp=Qmax(i<<1,l,(l+r)/2,ps);else tmp=Qmax(i<<1|1,(l+r)/2+1,r,ps);return les(t[i],tmp,ps)?tmp:t[i];}void insert(int i,int l,int r,seg se){if(!t[i].id)t[i]=se;if(les(t[i],se,l))swap(t[i],se);if(l==r||t[i].k==se.k)return;double x=(t[i].b-se.b)/(se.k-t[i].k);if(x<l||x>r)return;if(x<=(l+r)/2)insert(i<<1,l,(l+r)/2,t[i]),t[i]=se;else insert(i<<1|1,(l+r)/2+1,r,se);}void insert(int i,int l,int r,int l0,int r0,seg se){if(l0<=l&&r0>=r){insert(i,l,r,se);return;}if(l0<=(l+r)/2)insert(i<<1,l,(l+r)/2,l0,r0,se);if(r0>(l+r)/2)insert(i<<1|1,(l+r)/2+1,r,l0,r0,se);}}T;int la;int main(){scanf("%d",&m);char s[15];while(~scanf("%s",s)){if(s[0]=='Q'){int k;scanf("%d",&k);printf("%lld\n",(long long)(T.Qmax(1,1,n,k).get(k)/100+1e-8));}else{seg tmp;double S,P;scanf("%lf%lf",&S,&P);tmp.k=P;tmp.b=S-P;tmp.id=1;T.insert(1,1,n,1,n,tmp);}}return 0;}


0 0
原创粉丝点击