神仙题。

作者的正解:

算法二:对于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. fastjson map转json

    Map map = new HashMap(); map.put("name", "老三"); map.put("age", 12); St ...

  2. Struts_客户列表练习

    1.导包 2.配置文件struts.xml 3.创建CustomerAction 4.修改menu.jsp和List.jsp 5.配置web.xml

  3. Ubuntu上更换163源 - Mars Loo的博客

    转载*请注明原始出处:http://blog.csdn.net/a464057216/article/details/50865895 先备份源/etc/apt/sources.list为source ...

  4. 使用Cmder 安装 Composer 出现 "attempt to call a nil value"

    原因: 不是这个原因,也不是那个原因,而是采用了中文路径, 把comder 整个搬到其他目录就行了

  5. webpack学习之——npm的安装依赖情况

    这几天一直在研究webpack模块话打包工具,在网上的资源还是蛮丰富的,现在总结下这块的内容,需要好好的研究下,如果有问题,还请指正. 先是第一个为问题,就是npm-install --save 和n ...

  6. 26718汉字,gbk是23940个汉字,gb18030有76556个汉字

    1 a 厑 吖 呵 啊 嗄 嬶 腌 錒 锕 阿 仰 卬 岇 昂 昻 枊 盎 肮 腌 軮 醠 雵 骯 侒 俺 儑 匎 匼 厂 厈 唵 啽 垵 埯 堓 媕 安 屵 岸 峎 峖 广 庵 按 揞 晻 暗 案 ...

  7. setStorage、getStorage、 removeStorage 封装

    // 本地存储 setStorage(name, data){ let dataType = typeof data; // json对象 if(dataType === 'object'){ win ...

  8. Spring_事务

    事务管理: 用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当做一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性 原子性 一致性 隔离性 持久性 Spring两 ...

  9. Win7下IIS的安装配置与文件发布

    出于兴趣,抽空弄了一下Windows上的IIS,把过程记录下来与大家分享.高手请略过... 一.安装IIS.打开控制面板,单击“程序与功能” 二.点击左侧“打开或关闭Windows功能” 三.找到“I ...

  10. 在一个已经使用mybatis的项目里引入mybatis-plus,结果不能共存

    mybatis-plus版本号:3.0.6 问题产生原因: 原有的项目使用的是springboot+mybatis的框架,一切接口服务均没有问题.由于新的需求增加shiro权限认证,然后也在考虑用my ...