题目大意:

给出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的更多相关文章

  1. BZOJ 4576: [Usaco2016 Open]262144

    Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ 4742: [Usaco2016 Dec]Team Building

    4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 16[Su ...

  4. bzoj4409&&bzoj4410&&bzoj4411[Usaco2016 Feb Platinum]题解

    辣鸡wyz最近状态奇差,于是想用usaco题找找手感,万万没想到被虐了一脸TAT 先贴代码,有空再填坑 4409[Usaco2016 Feb]Circular barn #include <io ...

  5. P3147 [USACO16OPEN]262144

    P3147 [USACO16OPEN]262144一道非常有趣的游戏,不,题目.当数据水时,可以这样表示状态.f[i][j]表示合并[i,j]区间所能得到的最大值,有点floyed的小味道.if(f[ ...

  6. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    elasticsearch启动时遇到的错误 问题翻译过来就是:elasticsearch用户拥有的内存权限太小,至少需要262144: 解决: 切换到root用户 执行命令: sysctl -w vm ...

  7. P3146 [USACO16OPEN]248 & P3147 [USACO16OPEN]262144

    注:两道题目题意是一样的,但是数据范围不同,一个为弱化版,另一个为强化版. P3146传送门(弱化版) 思路: 区间动规,设 f [ i ][ j ] 表示在区间 i ~ j 中获得的最大值,与普通区 ...

  8. 一道另类的区间dp题 -- P3147 [USACO16OPEN]262144

    https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状 ...

  9. bzoj 4506: [Usaco2016 Jan]Fort Moo

    4506: [Usaco2016 Jan]Fort Moo Description Bessie is building a fort with her friend Elsie. Like any ...

随机推荐

  1. Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)

    http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...

  2. 《A Tour of PostgreSQL Internals》学习笔记——查询处理分析

           终于要迎来postgresql的<A Tour of PostgreSQL Internals>系列的最后一篇了.学习是不能拖延的事儿,越拖延事情越多.不废话,一起来看看吧~ ...

  3. python 矩阵转置

    arrA=[[,,,],[,,,],[,,,],[,,,]] N= #声明4x4数组arr arrB=[[None] * N for row in range(N)] print('[原设置的矩阵内容 ...

  4. [转载]Huffman编码压缩算法

    转自http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 D ...

  5. 基于Open XML 导出数据到Excel

    数据导出的结果: 步骤1.新建一个Excel 文档,模板根据自己需要设置 步骤2.使用OpenXml  打开Excel 文件 步骤3.点击ReflectCode 功能,生成相应的代码文档 using ...

  6. Maven的安装学习笔记

    安装 1.下载安装包:http://maven.apache.org/download.cgi 2.检查JDK是否安装,没有安装,先安装JDK cmd中输入:java -version 3.解压后配置 ...

  7. ES6中箭头函数的作用

    我们知道在ES6中,引入了箭头函数,其本质就是等同有ES5中的函数.类似于下面的写法: let test1=() => “abc”; let test2=() => { return “a ...

  8. HDU 2292

    http://acm.hdu.edu.cn/showproblem.php?pid=2292 题意:1-n个节点,题目给出了完全二叉树的定义(这个定义似乎有歧义,此题以题目描述为准),且要保持最小堆性 ...

  9. Oozie_01安装教程【20161116】

    说明:hadoop用的是hadoop-2.5.0-cdh5.3.6 Oozie用的是oozie-4.0.0-cdh5.3.6 该测试环境用户名为hadoop  主机名为hadoop01 2.4安装部署 ...

  10. MacBook下java环境的搭建

    在Mac下搭建JAVA环境: 1.下载并安装JDK: 下载最新的JDK,傻瓜式安装,一直下一步就OK了. 2.配置环境变量: 在终端中输入 sudo vim ~/.bash_profile ,打开 . ...