[***]HZOJ 柱状图
神仙题。
作者的正解:
算法二:对于60%的数据:考虑直接枚举屋顶的位置,总花费与屋顶的高度的关系是一个单峰函数,,我们可以用三分法三分屋顶的高度. 时间复杂度O(n2*logn)。
算法三:对于100%的数据: 我们枚举屋顶位置再三分高度的做法,复杂度的瓶颈在于花费的计算。假设屋顶在i处,高度为hi,如果j<i,有hj-j=hi-i ; 如果j>i,有hj+j=hi+i。
根据权值排序,建立树状数组来解决权值与i的权值的关系,用两个树状数组维护。时间复杂度O(n(logn)(logv),V为屋顶的高度。
对于60%的数据大概有两种做法:
1.如作者题解,说的挺清楚的。
2.考虑对于一个确定的位置作为屋顶,那么屋顶的高度是确定的,证明以后再说。将每个点的高度加上到屋顶的距离,高度为之后序列的中位数,所以就可以模拟退火了。
对于100%的数据:
1.模拟退火(没脸)。
2.枚举屋顶,三分高度,然后主要的优化就是在计算花费上。可以用两个树状数组维护。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#define int LL
#define LL long long
#define MAXN 100010
#define reg register
#define con const
using namespace std;
struct node
{
int val,id;
friend bool operator < (node a,node b)
{return !(a.val^b.val)?a.id<b.id:a.val<b.val;}
}al[MAXN],ar[MAXN];
int n,a[MAXN],maxh,rkl[MAXN],rkr[MAXN];
#define lowbit(x) ((x)&(-(x)))
struct bit
{
int C[MAXN],num[MAXN];
void add(reg int x,reg con int y,reg con int z)
{while(x<=n){C[x]+=y;num[x]+=z;x+=lowbit(x);}}
pair<int,int> ask(reg int x)
{
int sum=,nnum=;
while(x)
{
sum+=C[x];
nnum+=num[x];
x-=lowbit(x);
}
return make_pair(sum,nnum);
}
}le,re;
__attribute((always_inline))int get(reg con int x,reg con int maxh)
{
int ans=;
ans+=abs(maxh-a[x]);
int pos=upper_bound(al+,al+n+,(node){maxh-x,x})-al-;
pair<int,int> tem=le.ask(pos);
ans+=tem.second*(maxh-x)-tem.first;
pair<int,int> tem2=le.ask(n);
ans+=tem2.first-tem.first-(tem2.second-tem.second)*(maxh-x);
pos=upper_bound(ar+,ar+n+,(node){maxh+x,x})-ar-;
tem=re.ask(pos);
ans+=tem.second*(maxh+x)-tem.first;
tem2=re.ask(n);
ans+=tem2.first-tem.first-(tem2.second-tem.second)*(maxh+x);
return ans;
}
__attribute((always_inline))void read(int &s)
{
s=;
reg int f=;reg char a=getchar();
while(a<''||a>''){if(a=='-')f=-;a=getchar();}
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
s*=f;
}
signed main()
{
read(n);
int ans=0x7ffffffffffff;
for(reg int i=;i<=n;++i)
{
read(a[i]);
al[i].val=a[i]-i,al[i].id=i;
ar[i].val=a[i]+i,ar[i].id=i;
}
sort(al+,al+n+);
sort(ar+,ar+n+);
for(reg int i=;i<=n;++i)rkl[al[i].id]=i,rkr[ar[i].id]=i;
for(reg int i=;i<=n;++i)re.add(rkr[i],a[i]+i,);
for(reg int i=;i<=n;++i)
{
re.add(rkr[i],-a[i]-i,-);
int l=max(i,n-i+),r=1e9,ml,mr;
ans=min(ans,get(i,l));
while(r>l+)
{
int mid=(l+r)>>;
ml=mid-,mr=mid;
int ans1=get(i,ml),
ans2=get(i,mr);
if(ans1<ans2)r=mid;
else l=mid;
ans=min(ans,ans1);
ans=min(ans,ans2);
if(!(ml^l)&&!(mr^r))break;
}
le.add(rkl[i],a[i]-i,);
}
printf("%lld\n",ans);
}
[***]HZOJ 柱状图的更多相关文章
- Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
Webstorm+Webpack+echarts ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
- iOS绘制收益柱状图
项目需求,参考了其他绘图demo,自己绘制出来了,不过代码改得有点乱,添加了很多变量,时间关系没用太合适的命名,逻辑处理也没进行优化. 看看效果图(虚线区域都是画的,其他区域添加的都是控件),附上源码 ...
- WPF 自定义BarChartControl(可左右滑动的柱状图)
自定义可左右滑动.拖拽滑动的平面柱状图 在做这种样式控件之前,可先浏览我之前预研的控件: A.自定义左右滑动ScrollViewer(可拖动滑动) B.自定义Bar柱状图 OK,现在说下控件具体设计过 ...
- hellocharts的折线图与柱状图的结合之ComboLineColumnChartView
哼哼,网上找了半天都不全,所以决定自己写一个完整的可以直接贴代码的 test.xml <?xml version="1.0" encoding="utf-8&quo ...
- gnuplot: 一种更为简洁的曲线,柱状图绘图软件
gnuplot: 一种更为简洁的曲线,柱状图绘图软件 gnuplot: 一种更为简洁的曲线,柱状图绘图软件 Zhong Xiewei Wed Jun 25 gnuplot简单介绍 关于gnuplot的 ...
- arcgis api for flex之专题图制作(饼状图,柱状图等)
最近公司给我一个任务,就是利用arcgis api for flex实现在地图上点(业务数据)直接显示饼状图以及柱状图的专题图制作,而不是通过点击点显示气泡窗口的形式来实现,这个公司已经实现了. 经过 ...
- WPF 自定义柱状图 BarChart
WPF 自定义柱状图 当前的Telerik控件.DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的. 或者说,通过修改当前的第三方控 ...
- Extjs 制作柱状图
在JSP页面制作柱状图,可以根据数据的变化动态实时的变化 主要是使用EXTJS自带的插件达到效果 Ext.require('Ext.chart.*'); Ext.require([ 'Ext.Wind ...
- 【Android】achartengine的柱状图和饼状图的使用
本文介绍了android中如何使用achartengine绘制饼图和柱状图,请分别尝试饼图和柱状图,曲线图. 先看效果图: 先看看获取数据: Workbook workbook = Workbook. ...
随机推荐
- python 读取xml文件
首先,获得标签信息abc.xml <?xml version="1.0" encoding="utf-8"?> <catalog> &l ...
- oracle习题-简单查询
题一 1 实现将已知表中的数据插入到另一个表中 学生表:stu1 向表中插入两条数据 学生信息表2:stuinfo 将stu1表中的两条数据导入到stuinfo表中,执行下列语句 此时查看一下st ...
- Mybatis错误:Result Maps collection already contains value for ***
[转载]原文链接:https://blog.csdn.net/maoyuanming0806/article/details/77870345 使用mybatis时,服务器启动时出错 严重: Exce ...
- php thrift TServerSocket实现端口复用
<?php namespace Message\Controller; use Think\Controller; use Thrift\Exception\TException; use Th ...
- Postgresql 正则表达式【转】
原文:http://blog.csdn.net/wugewuge/article/details/7704996 postgresql支持POSIX 风格的正则表达式,在postgresql中使用正则 ...
- 【python小随笔】celery周期任务(简单原理)
1:目录结构 |--celery_task |--celery.py # 执行任务的main函数 |--task_one # 第一个任务 |--task_two # 第2个任务 . . . . |-- ...
- SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集
ALTER PROCEDURE [dbo].[usp_visit_detail](@siteid BIGINT, @Startime VARCHAR(15), @Endtime VARCHAR(15 ...
- 【水滴石穿】React-Redux-Demo
这个项目没有使用什么组件,可以理解就是个redux项目 项目地址为:https://github.com/HuPingKang/React-Redux-Demo 先看效果图 点击颜色字体颜色改变,以及 ...
- placeholder颜色更改
::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } :-moz-placeholder { /* Mozilla Fir ...
- ubuntu上制作应用程序的快捷图标启动
最近在研究Go语言,对比了几种流行的IDE,发现GoLand是使用体验最好的,没有之一.这也印证了网友们常说的那句话“JetBrain出品,必属精品”. 在ubuntu环境下使用GoLand,直接到J ...