题目大意:

给出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. Gym 101334E Exploring Pyramids(dp+乘法原理)

    http://codeforces.com/gym/101334 题意: 给出一棵多叉树,每个结点的任意两个子节点都有左右之分.从根结点开始,每次尽量往左走,走不通了就回溯,把遇到的字母顺次记录下来, ...

  2. 简单使用grunt、bower工具合并压缩js和css

    前段时间因为项目中的报表写了一个Jquery插件,开源到github上,参考以往大神们写的插件的姿势,决定搞了像模像样一点.言归正传.前端工程师对这些工具:Node,bower,grunt,npm这些 ...

  3. 使用由 Intel MKL 支持的 R

    我们通常使用的 R 版本是单线程的,即只使用一个 CPU 线程运行所有 R 代码.这样的好处是运行模型比较简单且安全,但是它并没有利用多核计算.Microsoft R Open(MRO,https:/ ...

  4. JAVA异常处理机制分析(上)

    过去曾有一段时间关于java的异常处理机制曾经让我吃尽苦头,异常机制看似简单,原理,用法也仅仅如此,但是,用起来或是在使用一些框架的时候总会因为使用不当,造成灾难性后果. jdk异常处理机制     ...

  5. YAML(摘录)

    YAML:维基百科 一个用来表达数据序列的格式.强调以数据为中心的标记语言. 使用空白符缩进和大量依赖外观的特殊,适合编辑数据结构,配置文件. 基本格式: 缩进/区块 和内置两者格式,来表示array ...

  6. zoj-3329-期望/dp/方程优化

    One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very ...

  7. 自定义jQuery的animate动画

    //擦除效果 jQuery.extend(jQuery.easing, { easeOutBack : function(x, t, b, c, d, s) { s = s || 1.3; retur ...

  8. POJ 3984 迷宫问题 bfs 难度:0

    http://poj.org/problem?id=3984 典型的迷宫问题,记录最快到达某个点的是哪个点即可 #include <cstdio> #include <cstring ...

  9. Beta发布

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2408] 视频展示 链接[https://www.cnblogs.com/erc ...

  10. selenium定位元素的8种方法

    By.id,By.name,By.tagName,By.className,By.linkText,By.partialLinkText,By.xpath,By.cssSelector <a h ...