[***]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. ...
随机推荐
- java httpclient中文乱码解决方案,看注释
@RequestMapping("getpage") public ModelAndView admin_checkurl(HttpServletRequest request) ...
- Thrift---more efficient transport protocol.
Thrift 是什么? Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thri ...
- spring boot 的 ApplicationContext 及 getbean
在spring中,我们通过如下代码取得一个spring托管类: ApplicationContext ac = new FileSystemXmlApplicationContext("ap ...
- python 数据标准化
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- golang之switch
- spring源码学习之默认标签的解析(一)
继续spring源码的学习之路,现在越来越觉得这个真的很枯燥的,而且我觉得要是自己来看源码,真的看不下去,不是没有耐心,而是真的没有头绪,我觉得结合着书来看,还是很有必要的,最起码大致的流程是能够捋清 ...
- Spring_Hibernate
Spring与Hiberante整合 通过hibernate的学习,我们知道,hibernate主要在hibernate.cfg.xml配置文件中 接下来我们看一下hibernate的一个配置文件 h ...
- Python3.7.4入门-4模块
4 模块 Python有一种方法可以把定义放在一个文件里,并在脚本或解释器的交互式实例中使用它们.这样的文件被称作 模块 :模块中的定义可以 导入 到其它模块或者 主 模块 模块是一个包含Python ...
- GitHub上的SliddingMenu滑动过程中卡顿问题的解决的方法
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wenyiqingnianiii/article/details/25123995 找了非常久,仅仅需 ...