[BZOJ3203][SDOI2013]保护出题人(凸包+三分)

https://www.cnblogs.com/Skyminer/p/6435544.html

先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 4 typedef long long ll;
 5 using namespace std;
 6 
 7 const int N=100010;
 8 double ans;
 9 ll d,a[N],x[N],sm[N];
10 int n,top;
11 struct P{ double x,y; }p[N],stk[N];
12 double sl(P &a,P &b){ return (b.y-a.y)/(b.x-a.x); }
13 
14 int main(){
15     freopen("bzoj3203.in","r",stdin);
16     freopen("bzoj3203.out","w",stdout);
17     scanf("%d%lld",&n,&d);
18     rep(i,1,n){
19         scanf("%lld%lld",&a[i],&x[i]); sm[i]=sm[i-1]+a[i];
20         P t=(P){1.*i*d,1.*sm[i-1]};
21         while (top>1 && sl(stk[top-1],t)>sl(stk[top],t)) top--;
22         stk[++top]=t;
23         int L=1,R=top;
24         t=(P){1.*x[i]+i*d,1.*sm[i]};
25         while (L<R-2){
26             int m1=L+(R-L)/3,m2=R-(R-L)/3;
27             if (sl(stk[m1],t)<sl(stk[m2],t)) L=m1+1; else R=m2;
28         }
29         double res=0;
30         rep(i,L,R) res=max(res,sl(stk[i],t));
31         ans+=res;
32     }
33     printf("%.0lf\n",ans);
34     return 0;
35 }

 

posted @ 2018-12-02 12:27  HocRiser  阅读(166)  评论(0编辑  收藏  举报