神仙题。

作者的正解:

算法二:对于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 柱状图的更多相关文章

  1. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

    Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  2. iOS绘制收益柱状图

    项目需求,参考了其他绘图demo,自己绘制出来了,不过代码改得有点乱,添加了很多变量,时间关系没用太合适的命名,逻辑处理也没进行优化. 看看效果图(虚线区域都是画的,其他区域添加的都是控件),附上源码 ...

  3. WPF 自定义BarChartControl(可左右滑动的柱状图)

    自定义可左右滑动.拖拽滑动的平面柱状图 在做这种样式控件之前,可先浏览我之前预研的控件: A.自定义左右滑动ScrollViewer(可拖动滑动) B.自定义Bar柱状图 OK,现在说下控件具体设计过 ...

  4. hellocharts的折线图与柱状图的结合之ComboLineColumnChartView

    哼哼,网上找了半天都不全,所以决定自己写一个完整的可以直接贴代码的 test.xml <?xml version="1.0" encoding="utf-8&quo ...

  5. gnuplot: 一种更为简洁的曲线,柱状图绘图软件

    gnuplot: 一种更为简洁的曲线,柱状图绘图软件 gnuplot: 一种更为简洁的曲线,柱状图绘图软件 Zhong Xiewei Wed Jun 25 gnuplot简单介绍 关于gnuplot的 ...

  6. arcgis api for flex之专题图制作(饼状图,柱状图等)

    最近公司给我一个任务,就是利用arcgis api for flex实现在地图上点(业务数据)直接显示饼状图以及柱状图的专题图制作,而不是通过点击点显示气泡窗口的形式来实现,这个公司已经实现了. 经过 ...

  7. WPF 自定义柱状图 BarChart

    WPF 自定义柱状图 当前的Telerik控件.DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的. 或者说,通过修改当前的第三方控 ...

  8. Extjs 制作柱状图

    在JSP页面制作柱状图,可以根据数据的变化动态实时的变化 主要是使用EXTJS自带的插件达到效果 Ext.require('Ext.chart.*'); Ext.require([ 'Ext.Wind ...

  9. 【Android】achartengine的柱状图和饼状图的使用

    本文介绍了android中如何使用achartengine绘制饼图和柱状图,请分别尝试饼图和柱状图,曲线图. 先看效果图: 先看看获取数据: Workbook workbook = Workbook. ...

随机推荐

  1. webpack学习之—— Plugins

    Plugins are the backbone of webpack! webpack 自身也是构建于你在 webpack 配置中用到的相同的插件系统之上! 插件目的在于解决 loader 无法实现 ...

  2. python正则表达式应用 定义一个函数,求字符串中出现的所有整数之和

  3. Leetcode892.Surface Area of 3D Shapes三维形体的表面积

    在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上. 返回结果形体的总表面积. 示例 1: ...

  4. PHP学习(mysqli函数)

    php是一种运行在服务器端的程序语言,用于生产动态网页内容.特点:开源,简单,易上手,跨平台(windows,linux),占用资源少,尤其适合中小型应用开发.(微博,微信,论坛等等)一,搭建软件环境 ...

  5. HZOI20190714 T3建造游乐场

    先放作者的正解: 先说g吧,有i个点的话,在其中i-1个点中有$C_{i-1}^{2}$种边,每个边有选和不选两种情况.如果度不是偶数呢?用剩下那个点给他连上呗.如果剩下那个点度数不是偶数呢?这是不可 ...

  6. PHP开发api接口安全验证的实例,值得一看

    php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...

  7. thinkphp---display与fetch区别

    区别: ① display方法直接输出模板文件渲染后的内容,fetch方法是返回模板文件渲染后的内容 ② 有时候我们不想直接输出模板内容,而是希望对内容再进行一些处理后输出, 就可以使用fetch方法 ...

  8. 关于spring中<util:/>的配置

    解决redis设置缓存时间找到的帖子,我这个初学者需要学习的还是很多的. 原文地址:http://www.doc100.net/bugs/t/216322/index.html 探索<util/ ...

  9. 【JZOJ4761】【NOIP2016提高A组模拟9.7】鼎纹

    题目描述 输入 输出 样例输入 2 3 4 4 2 1100 0110 1100 10 01 10 00 2 2 2 2 11 11 01 10 样例输出 YES NO 数据范围 解法 由于鼎纹中的第 ...

  10. python 利用csv模块导入数据