convex hull trick CF344.E
类似于斜率优化的东西,果真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的更多相关文章
- 凸包(Convex Hull)构造算法——Graham扫描法
凸包(Convex Hull) 在图形学中,凸包是一个非常重要的概念.简明的说,在平面中给出N个点,找出一个由其中某些点作为顶点组成的凸多边形,恰好能围住所有的N个点. 这十分像是在一块木板上钉了N个 ...
- Convex Hull 实现理论+自制Python代码
Convex Hull 概述 计算n维欧式空间散点集的凸包,有很多的方法.但是如果要实现快速运算则其难点在于:如何快速判断散点集的成员是否是在凸集的内部.如果可以简化判断的运算过程,则可以极大简化迭代 ...
- OpenCV入门之寻找图像的凸包(convex hull)
介绍 凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包. 在图像处理过程中,我们 ...
- 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 ...
- Monotone Chain Convex Hull(单调链凸包)
Monotone Chain Convex Hull(单调链凸包)算法伪代码: //输入:一个在平面上的点集P //点集 P 按 先x后y 的递增排序 //m 表示共a[i=0...m]个点,ans为 ...
- convex hull
1 什么是convex hull 就是凸包,是计算几何中的一个概念,计算几何是计算机图形学的基础之一. 对于二维平面来说是这样的:对于二维平面上的点集,凸包是位于最外层的点构成的包围其它所有的点的凸多 ...
- opencv::凸包-Convex Hull
概念介绍 什么是凸包(Convex Hull),在一个多变形边缘或者内部任意两个点的连线都包含在多边形边界或者内部. 正式定义:包含点集合S中所有点的最小凸多边形称为凸包 Graham扫描算法 首先选 ...
- 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 ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
随机推荐
- react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
1.下拉刷新/上拉加载更多 组件(RefreshListView) src/components/RefreshListView/index.js /** * 下拉刷新/上拉加载更多 组件(Refre ...
- 首先给大家介绍一下数据库project师,数据库project师(Database Engineer),是从事管理和维护数据库管理系统(DBMS)
摘要 MySQL的最初的核心思想,主要是开源.简便易用.其开发可追溯至1985年,而第一个内部发行版本号诞生,已经是1995年. 到1998年,MySQL已经能够支持10中操作系统了.当中就包含win ...
- LDAP简介及LDAP服务器的安装与配置
一.LDAP简介 全称:Lightweight Directory Access Protocol,目录服务是一种特殊的数据库系统,其专门针对读取. LDAP目录中的信息是按照树型结构组织,具体信息存 ...
- java 开发中的debug
mysql 的 级联删除与级联更新 create table student( id int, departmentId int, foreign key(departmentId) referenc ...
- js使用ctrl+s保存表单提升用户体验
本质上是监控ctrl+s 然后触发相应事件 <script language="JavaScript"> //Ctrl+s保存 document.onkeydown=f ...
- net.reflector8.5.0.179过了试用期,要求输入序列号怎么办 注册机 破解
去网上搜索“reflector keygen注册机下载”,随便找一个版本下载(如果你之前下载的软件自带有“Keygen.exe”注册机的话,直接用自带的注册机就可以了)1.断开网络2.下载安装原程序, ...
- 常用Sql 标量值函数
1.汉字拼音首字母 /****** Object: UserDefinedFunction [dbo].[fnGetHzPY] Script Date: 08/16/2018 09:04:47 Des ...
- JAVA 双重检查锁定和延迟初始化
双重检查锁定的由来在Java程序中,有时需要推迟一些高开销的对象的初始化操作,并且只有在真正使用到这个对象的时候,才进行初始化,此时,就需要延迟初始化技术.延迟初始化的正确实现是需要一些技巧的,否则容 ...
- YDKJS读书笔记
程序的本质就是语句的集合,只不过按照顺序进行排列了而已. 语句包含表达式,表达式包含代码,程序由语句组成. interpreter,解释器:compiler,编译器:他们的职责就是将对人友好的语句翻译 ...
- Unity3d 引擎原理详细介绍、Unity3D引擎架构设计 - zhibolife
时间 2014-03-24 11:18:00 博客园-所有随笔区原文 http://www.cnblogs.com/zhibolife/p/3620440.html 体系结构 为了更好地理解游戏的 ...