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 ...
随机推荐
- 【Swift】学习笔记(三)——字符和字符串
基本了解了变量的创建和基础数据类型,但是在开发中用得最多的还是字符串.那什么是字符串呢? Swift 的String类型表示特定序列的Character(字符) 类型值的集合,它是值类型具有可变性 S ...
- python——PEP8 Python 编码规范整理
决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...
- Django——如何在Django模板中注入全局变量?——part1
问题:TEMPLATE_CONTEXT_PROCESSORS代表着什么? 问题描述:无法在项目的settings.py文件中找到TEMPLATE_CONTEXT_PROCESSORS. ——————— ...
- jquery 事件,注册 与重复事件处理
jquery有时候会出现重复注册一个事件的问题,导致点击一个事件,这个事件被重复执行,也就是触发事件的次数有几次, 那么这个事件就会被执行叠加重复几次. 我这边做的一个项目,在某个页面初始化的时候,给 ...
- Velocity写法注意
1.$Proerty与$!{Property}的区别 比如: 简单的key-value数据格式情况下 a.<C_APP_NME>$Applicant_CAppNme</C_APP_N ...
- 初学spring(二)
1.spring推荐使用接口编程,配合di可以达到层与层之间解耦
- js知识地图--js大脑图beta01版正式发布
原文地址 http://zhangyaochun.iteye.com/blog/1682605 原作者:zhangyaochun
- HTTP协议--cookie、session、缓存与代理
1 Cookie和 Session Cookie和 Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决 HTTP无状态的问题而所做的努力. Session可以用 Cook ...
- android中几个很有用的的api
0x0001 public PackageInfo getPackageArchiveInfo (String archiveFilePath, int flags) Since: API Level ...
- J2EE的体系架构——J2EE
J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核心是一组技术规范与指南,提供基于组件的方式来设计.开发.组装和部署企业应用.J2EE使用多 ...