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 ...
随机推荐
- MyBatis小案例完善增强
https://blog.csdn.net/techbirds_bao/article/details/9233599 上链接为一个不错的Mybatis进阶博客 当你把握时间,时间与你为伍. 将上一个 ...
- python 匹配指定后缀的文件名
import glob x=glob.glob('*.py') print(x)
- Mediator(中介者)
意图: 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性: 一组对象以定义良好但是复杂的方式进行通信.产生的相互依 ...
- android 蓝牙通信编程讲解
以下是开发中的几个关键步骤: 1,首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket,获取输入输出流 4,读取和写入数据 5,断开连接关闭蓝牙 下面是一个demo 效果图: SearchDevi ...
- Spring中<bean>标签之使用p标签配置bean的属性
在spring的bean配置文件中我们常可以见到下面的例子: <bean id="user" class="com.sys.User" p:name-re ...
- 雷林鹏分享:Ruby Web Services 应用 - SOAP4R
Ruby Web Services 应用 - SOAP4R 什么是 SOAP? 简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范. ...
- 将keras模型在django中应用时出现的小问题——ValueError: Tensor Tensor("dense_2/Softmax:0", shape=(?, 8), dtype=float32) is not an element of this graph.
本文原出处(感谢作者提供):https://zhuanlan.zhihu.com/p/27101000 将keras模型在django中应用时出现的小问题 王岳王院长 10 个月前 keras 一个做 ...
- ACM比赛学习指导(20180223)
0.比赛介绍 (1)浙江省大学生程序设计比赛,3人一组,题目为英文 (2)ACM程序设计比赛 百度百科介绍 1.理论学习 (1)<挑战程序设计竞赛>,秋叶拓哉,巫泽俊 (2)<算法竞 ...
- POJ 3414 dfs 回溯
题目链接:http://poj.org/problem?id=3414 题意:三个值A, B, C, A和B是两个杯子的容量,问最短操作数使A或者B里的水量是C.有三种操作. 思路:dfs.暴力 很简 ...
- c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库
///c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库 闲话不多说,直接上代码 using System; using System.Collectio ...