类似于斜率优化的东西,果真CF的E以后才会考点算法啊。

感觉这种优化应该很常见,但这题直线只有第一象限的,但是插入,和查找操作是不变的,按极角排序后就可以直接用这个模板了。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std; typedef long long ll; struct Line
{
ll a,b;
ll get(ll x)
{
return a*x+b;
}
}; struct Convex_Hull
{
int size;
Line ls[];
void init()
{
size=;
}
bool is_bad(int one,int two,int three)//目前凸包集为xxx12 要将3插入,判断是否删除2
{
Line l1=ls[one],l2=ls[two],l3=ls[three];
return (l2.b-l1.b)*(l1.a-l3.a)>=(l3.b-l1.b)*(l1.a-l2.a);//我这样肯定可以!
}
void add_line(ll a,ll b)
{
ls[size++] = Line{a,b};//这样写也可以?
while(size>= && is_bad(size-, size-, size-) )
{
ls[size-] = ls[size-]; size--;
}
}
ll query(ll x)
{
int b=-,d=size-;
while(d-b > )
{
int mid=(b+d)/;
if( ls[mid].get(x) <= ls[mid+].get(x) )
{
b = mid;
}
else d = mid;
}
return ls[d].get(x);
}
}; #define N 200200 ll sum[N];
ll ans,tans;
Convex_Hull cv;
int g[N]; int main() {
int n;
cin>>n;
sum[]=;
for(int i=;i<=n;i++)
{
scanf("%d",g+i);
sum[i] = sum[i-]+g[i];
ans += (ll)i*g[i];
}
cv.init();
for(int i=;i<=n;i++)
{
cv.add_line(i-, -sum[i-]);
tans = max(tans,cv.query(g[i])+sum[i-]-(ll)i*g[i]);
} //第二遍,逆着写。
cv.init();
for(int i=n-;i>=;i--)
{
cv.add_line(-(i+), -sum[i+]);
tans = max(tans,cv.query(-g[i])+sum[i]-(ll)i*g[i]);
}
cout<<ans+tans<<endl;
return ;
}

convex hull trick CF344.E的更多相关文章

  1. 凸包(Convex Hull)构造算法——Graham扫描法

    凸包(Convex Hull) 在图形学中,凸包是一个非常重要的概念.简明的说,在平面中给出N个点,找出一个由其中某些点作为顶点组成的凸多边形,恰好能围住所有的N个点. 这十分像是在一块木板上钉了N个 ...

  2. Convex Hull 实现理论+自制Python代码

    Convex Hull 概述 计算n维欧式空间散点集的凸包,有很多的方法.但是如果要实现快速运算则其难点在于:如何快速判断散点集的成员是否是在凸集的内部.如果可以简化判断的运算过程,则可以极大简化迭代 ...

  3. OpenCV入门之寻找图像的凸包(convex hull)

    介绍   凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包.   在图像处理过程中,我们 ...

  4. 2D Convex Hulls and Extreme Points( Convex Hull Algorithms) CGAL 4.13 -User Manual

    1 Introduction A subset S⊆R2 is convex if for any two points p and q in the set the line segment wit ...

  5. Monotone Chain Convex Hull(单调链凸包)

    Monotone Chain Convex Hull(单调链凸包)算法伪代码: //输入:一个在平面上的点集P //点集 P 按 先x后y 的递增排序 //m 表示共a[i=0...m]个点,ans为 ...

  6. convex hull

    1 什么是convex hull 就是凸包,是计算几何中的一个概念,计算几何是计算机图形学的基础之一. 对于二维平面来说是这样的:对于二维平面上的点集,凸包是位于最外层的点构成的包围其它所有的点的凸多 ...

  7. opencv::凸包-Convex Hull

    概念介绍 什么是凸包(Convex Hull),在一个多变形边缘或者内部任意两个点的连线都包含在多边形边界或者内部. 正式定义:包含点集合S中所有点的最小凸多边形称为凸包 Graham扫描算法 首先选 ...

  8. Convex Hull | Set 1

    Given a set of points in the plane. the convex hull of the set is the smallest convex polygon that c ...

  9. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

随机推荐

  1. Linux网络配置之虚拟网卡的配置(ubuntu 16.04)案例

    sudo vim /etc/network/interfaces 标红的名称一定要一致 sudo vim /etc/resolv.conf  配置外网的ip(默认可以不填,系统自己获取)

  2. ffmpeg 复用

    aa 将mkv中的音视频复用成ts流: ffmpeg -i 32_mkv_h264_718x480_ac3.mkv  -codec copy -bsf:v h264_mp4toannexb  -f m ...

  3. 【Java】Java_13 分支结构

    Java中常见的两种分支结构: <1>If语句:使用布尔表达式或者布尔类型值作为分支条件来进行分支控制. <2>switch语句:对多个整形值进行匹配,从而实现分支控制. 1. ...

  4. iOS开发-Swift获取手机设备信息(UIDevice)

    使用UiDevice获取设备信息 获取设备名称 let name = UIDevice.currentDevice().name 获取设备系统名称 let systemName = UIDevice. ...

  5. 《windows核心编程》- 线程栈

    当系统创建线程的时候,会为线程栈预订一块地址空间区域,并给该区域调拨一些物理存储器.默认会预订1MB的地址空间并调拨两个页面的存储器.但是在构建 应用程序的时候可以改变这个默认值 在构建应用程序的时候 ...

  6. html标签说明

    dictype 不区分大小写 HTML 4.01 与 HTML5 之间的差异 在 HTML 4.01 中有三种 <!DOCTYPE> 声明.在 HTML5 中只有一种: <!DOCT ...

  7. Mac和Windows上Android Studio经常使用的快捷键

    小编整理了一些Mac和Windows上超有用的Android Studio经常使用的快捷键. Ctrl(Command)+Y 删除行 Ctrl(Command)+Z 倒退 Ctrl(Command)+ ...

  8. nginx跨域(转2)

    当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...

  9. JDK1.9环境变量配置

    JAVA_HOME C:\Program Files\Java\jdk-9.0.1 JRE_HOME C:\Program Files\Java\jre-9.0.1 PATH .;%JAVA_HOME ...

  10. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...