bzoj4576 [Usaco2016 Open]262144
题目大意:
给出n个数a[1..n],n<=262144,a[i]<=40,相邻且相同的数可以合并成一个并将值加1,问能获得的最大数是多少
用一个双向链表维护原数列,每个节点记录此节点对应的数值和数的个数,合并相邻且对应数值相同的节点
每次选一个数值最小的点处理,此时两侧的数都更大
若这个点只有一个数则直接删去并断开两侧,此时两侧的数不可能再互相合并
若这个点有偶数个数则数值+1,个数/2,检测能否和两侧合并
若这个点有奇数个数,两侧的数也不可能再互相合并了,因此将这个点分裂成两个互不相连的点,数值+1,(个数-1)/2,分别与两侧连接
可以证明时空复杂度均为O(n)
#include<cstdio>
#include<vector>
inline int input(){
int x=,c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
const int N=;
std::vector<int>q[];
int nx[N],pv[N],v[N],t[N],p=,ans=,n;
int main(){
n=input();
for(int i=,a=-,b;i<=n;i++){
b=input();
if(a!=b)v[++p]=b;
++t[p];
a=b;
}
for(int i=;i<=p;i++){
pv[i]=i-;
nx[i]=i+;
q[v[i]].push_back(i);
}
nx[p]=;
for(int i=;i<;i++){
for(int j=,sz=q[i].size();j<sz;j++){
int w=q[i][j];
if(!t[w])continue;
if(t[w]==){
nx[pv[w]]=pv[nx[w]]=;
t[w]=;
}else if(t[w]&){
int _t=t[w]>>,_pv=pv[w],_nx=nx[w],_v=v[w]+;
t[w]=;
if(v[_pv]==_v){
t[_pv]+=_t;
pv[_nx]=nx[_pv]=;
}else{
nx[_pv]=++p;
pv[p]=_pv;
t[p]=_t;
v[p]=_v;
q[_v].push_back(p);
}
if(v[_nx]==_v){
t[_nx]+=_t;
pv[_nx]=nx[_pv]=;
}else{
pv[_nx]=++p;
nx[p]=_nx;
t[p]=_t;
v[p]=_v;
q[_v].push_back(p);
}
}else{
int _t=t[w]>>,_pv=pv[w],_nx=nx[w],_v=v[w]+;
t[w]=;
if(v[_pv]==_v){
if(v[_nx]==_v){
t[_pv]+=t[_nx]+_t;
t[_nx]=;
pv[nx[_pv]=nx[_nx]]=_pv;
}else{
t[_pv]+=_t;
pv[_nx]=_pv;
nx[_pv]=_nx;
}
}else if(v[_nx]==_v){
t[_nx]+=_t;
pv[_nx]=_pv;
nx[_pv]=_nx;
}else{
t[w]=_t;
v[w]=_v;
q[_v].push_back(w);
}
}
}
}
for(int i=;i<=p;i++)if(v[i]>ans)ans=v[i];
printf("%d",ans);
return ;
}
bzoj4576 [Usaco2016 Open]262144的更多相关文章
- BZOJ 4576: [Usaco2016 Open]262144
Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 4742: [Usaco2016 Dec]Team Building
4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 21 Solved: 16[Su ...
- bzoj4409&&bzoj4410&&bzoj4411[Usaco2016 Feb Platinum]题解
辣鸡wyz最近状态奇差,于是想用usaco题找找手感,万万没想到被虐了一脸TAT 先贴代码,有空再填坑 4409[Usaco2016 Feb]Circular barn #include <io ...
- P3147 [USACO16OPEN]262144
P3147 [USACO16OPEN]262144一道非常有趣的游戏,不,题目.当数据水时,可以这样表示状态.f[i][j]表示合并[i,j]区间所能得到的最大值,有点floyed的小味道.if(f[ ...
- max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
elasticsearch启动时遇到的错误 问题翻译过来就是:elasticsearch用户拥有的内存权限太小,至少需要262144: 解决: 切换到root用户 执行命令: sysctl -w vm ...
- P3146 [USACO16OPEN]248 & P3147 [USACO16OPEN]262144
注:两道题目题意是一样的,但是数据范围不同,一个为弱化版,另一个为强化版. P3146传送门(弱化版) 思路: 区间动规,设 f [ i ][ j ] 表示在区间 i ~ j 中获得的最大值,与普通区 ...
- 一道另类的区间dp题 -- P3147 [USACO16OPEN]262144
https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状 ...
- bzoj 4506: [Usaco2016 Jan]Fort Moo
4506: [Usaco2016 Jan]Fort Moo Description Bessie is building a fort with her friend Elsie. Like any ...
随机推荐
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)
http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...
- 《A Tour of PostgreSQL Internals》学习笔记——查询处理分析
终于要迎来postgresql的<A Tour of PostgreSQL Internals>系列的最后一篇了.学习是不能拖延的事儿,越拖延事情越多.不废话,一起来看看吧~ ...
- python 矩阵转置
arrA=[[,,,],[,,,],[,,,],[,,,]] N= #声明4x4数组arr arrB=[[None] * N for row in range(N)] print('[原设置的矩阵内容 ...
- [转载]Huffman编码压缩算法
转自http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 D ...
- 基于Open XML 导出数据到Excel
数据导出的结果: 步骤1.新建一个Excel 文档,模板根据自己需要设置 步骤2.使用OpenXml 打开Excel 文件 步骤3.点击ReflectCode 功能,生成相应的代码文档 using ...
- Maven的安装学习笔记
安装 1.下载安装包:http://maven.apache.org/download.cgi 2.检查JDK是否安装,没有安装,先安装JDK cmd中输入:java -version 3.解压后配置 ...
- ES6中箭头函数的作用
我们知道在ES6中,引入了箭头函数,其本质就是等同有ES5中的函数.类似于下面的写法: let test1=() => “abc”; let test2=() => { return “a ...
- HDU 2292
http://acm.hdu.edu.cn/showproblem.php?pid=2292 题意:1-n个节点,题目给出了完全二叉树的定义(这个定义似乎有歧义,此题以题目描述为准),且要保持最小堆性 ...
- Oozie_01安装教程【20161116】
说明:hadoop用的是hadoop-2.5.0-cdh5.3.6 Oozie用的是oozie-4.0.0-cdh5.3.6 该测试环境用户名为hadoop 主机名为hadoop01 2.4安装部署 ...
- MacBook下java环境的搭建
在Mac下搭建JAVA环境: 1.下载并安装JDK: 下载最新的JDK,傻瓜式安装,一直下一步就OK了. 2.配置环境变量: 在终端中输入 sudo vim ~/.bash_profile ,打开 . ...