【JZOJ 3083】 塔(加强)
来源:互联网 发布:淘宝助理最新版 编辑:程序博客网 时间:2024/05/17 14:25
Description
今天你瞄准了下述的好玩的游戏:
首先是主角:塔。你有N座塔一列排开。每座塔各自有高度,有可能相等。 你每次可以选择相邻的两座塔合并在一起,即这两座塔的高度叠加后变成了同一座塔。然后原本分别与这两座塔相邻的塔变得与这座新的塔相邻。 你的目标是在使用最少的操作次数在游戏的最后获得一列塔,这些塔的高度从左到右形成一个不下降的数列。
对于100%的数据 1<=N,Ai<=10^6
Analysis
首先,设
可以发现一个神奇的性质,最小的
很好证,将题转化成一列数分若干组,使得位置靠左的组内数之和<=其右边的组内的数之和。显然分的组数越多越好,因为
那么组越多,答案越小,组内数之和越小,证毕。
那么距离
然后这个东西可以扔进一个单调队列里面,维护一下。
但是这里的单调队列很神奇。
其队头合法,队头后面的全部不合法。
那么如果第二个位置合法了就把队头踢掉。
如果当前的
Code
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,b,a) for(int i=b;i>=a;i--)using namespace std;typedef long long ll;const int N=1e6+10;int n,m,f[N],q[N];ll g[N],sum[N];ll s(int l,int r){return sum[r]-sum[l-1];}int main(){ int x; scanf("%d",&n); fo(i,1,n) scanf("%d",&x),sum[i]=sum[i-1]+x; int l=1,r=1; q[1]=1; fo(i,1,n) { while(l<r && s(q[l+1],i)>=g[q[l+1]-1]) l++; f[i]=f[q[l]-1]+i-q[l]; g[i]=s(q[l],i); while(l<r && g[i]+sum[i]<g[q[r]-1]+sum[q[r]-1]) r--; q[++r]=i+1; } printf("%d",f[n]); return 0;}
0 0
- 【JZOJ 3083】塔(加强)
- 【JZOJ 3083】 塔(加强)
- JZOJ 3083. 塔(加强)
- 【JZOJ 3809】 设备塔
- 【JZOJ 3809】设备塔
- 【JZOJ 5497】 塔
- 1489. 区间 (jzoj)
- 1490. 士兵(jzoj)
- 【NOIP2012模拟11.1】塔(加强)
- 【NOIP2012模拟11.1】塔(加强)
- JZOJ3083. 【NOIP2012模拟11.1】塔(加强)
- jzoj3083. 【NOIP2012模拟11.1】塔(加强)
- JZOJ 4746 树塔狂想曲
- JZOJ(C组)雾雨魔理沙
- 【普及模拟】数列 (jzoj)
- 1492. 交错匹配 (jzoj)
- [高精度](JZOJ)开关灯泡
- 基础加强(概述)
- sql语句中order by 多个字段同时排序的应用
- {题解}[jzoj3083]【NOIP2012模拟11.1】塔
- 数据结构——4 单链表查找中间节点
- ubuntu搭建hadoop 2.7.2 Single Node Cluster及windows eclipse yarn提交Mapreduce笔记
- Htc Vive Sdk(OpenVR),Unity3d 开发,手柄射线
- 【JZOJ 3083】 塔(加强)
- 字符串处理通用类
- 图结构练习——判断给定图是否存在合法拓扑序列
- OpenStack Mitaka Ceilometer-Aodh
- MySQL 总结(1)
- db2脚本、存储过程执行命令
- Charles录制App的接口har文件
- 通过JDBC进行简单的增删改查(以MySQL为例)
- 【JZOJ3082】骰子游戏