#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdlib>
#include<string>
#include<bitset>
#include<iomanip>
#include<deque>
#include<utility>
#define INF 1000000000
#define fi first
#define se second
#define N 2000005
#define P 1000000007
#define debug(x) cerr<<#x<<"="<<x<<endl
#define MP(x,y) make_pair(x,y)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
char _ch;
inline void getint(int &_x)
{
_x=;
for(_ch=getchar();_ch>''||_ch<'';_ch=getchar());
for(;_ch<=''&&_ch>='';_ch=getchar())
_x=_x*+_ch-;
} int stk1[N],top1,stk2[N],top2,ans,n;
//stk1是当前的单调栈,stk2存将要放到stk1中的元素
//stk1里是单调不升的,stk2也是单调不升的
int a; void Clear()//时间复杂度还能保持O(n)
{
int i,now,val;
while(top1)
{
val=stk1[top1];
for(i=top1;i;i--)
if(stk1[top1]!=stk1[i-])
break;
now=top1-i+;
top1=i-;
while(now/)//两两合并成一个更大的
{
stk1[++top1]=val+;
now-=;
}
//for(int j=1;j<=top1;j++)
//debug(stk1[j]);
//cout<<endl;
//ans=max(ans,stk1[1]);
}
ans=max(ans,stk1[]);
} int main()
{
int i,j,now,val;
freopen("vincent.in","r",stdin);
freopen("vincent.out","w",stdout);
cin>>n;
for(i=;i<=n;i++)
{
getint(a);
stk2[++top2]=a;
while(top2)//总共分5种情况
{
if(!top1)//假如第一个栈为空
{
//if(top2>1)
//top2--;
//else
stk1[++top1]=stk2[top2--];
}
else
{
if(stk1[top1]>stk2[top2])//假如第一个栈顶大于第二个栈顶
//if(top2>1)//假如第二个栈
//while(--top1);//清空
//else
stk1[++top1]=stk2[top2--];
else if(stk1[top1]==stk2[top2])//假如第一个栈顶等于第二个栈顶
/*
if(top2>1)//将两个元素合并成一个大的
{
top2--;
stk1[top1]++;
}
else*/
{
stk1[++top1]=stk2[top2--];//相等就先放进去 }
else if(stk1[top1]<stk2[top2])
{
if(top1>&&stk1[top1]==stk1[top1-])//贪心合并栈1顶的两个元素,并放入栈2
{
stk2[++top2]=stk1[top1]+;
top1-=;
}
else
{
top1--;
for(j=;j<=top2;j++)//清空之前将部分栈2内的元素放到栈1内
stk1[++top1]=stk2[j];
Clear();//只能清空掉了
}
}
}
//for(int j=1;j<=top1;j++)
//debug(stk1[j]); //for(int j=1;j<=top2;j++)
//debug(stk2[j]);
//cout<<endl; }
//for(int j=1;j<=top1;j++)
//debug(stk1[j]);
ans=max(ans,stk1[top1]);
}
//for(i=1;i<=top1;i++)
//debug(stk1[i]);
//cout<<endl;
//debug(top1);
Clear();
cout<<ans<<endl;
return ;
}
// davidlee1999WTK 2016/
// srO myk Orz
// ios::sync_with_stdio(false);
//#pragma comment(linker, "/STACK:102400000,102400000") compiler c++,not g++
/*
16
4 4 4 3 3 3 1 1 2
*/

繁华模拟赛 Vicent与游戏的更多相关文章

  1. 繁华模拟赛 Vicent坐电梯

    /*n<=5000­这样就不能用O(n)的转移了,而是要用O(1)的转移.­注意我们每次的转移都来自一个连续的区间,而且我们是求和­区间求和?­前缀和!­令sum[step][i]表示f[ste ...

  2. 繁华模拟赛 vicent的字符串

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  3. 繁华模拟赛 David与Vincent的博弈游戏

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  4. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

  5. [繁华模拟赛]Evensgn 剪树枝

    Evensgn 剪树枝 题目 繁华中学有一棵苹果树.苹果树有 n 个节点(也就是苹果),n − 1 条边(也就 是树枝).调皮的 Evensgn 爬到苹果树上.他发现这棵苹果树上的苹果有两种:一 种是 ...

  6. noip模拟赛 解谜游戏

    题目描述LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画.幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它.老板有一个n*m的矩阵,他想找一个 ...

  7. 20180606模拟赛T4——数学游戏

    数学游戏 题目描述: 小T又发脑残了,没错,她又要求奇怪的东西,这次她想知道[X,Y]之间整数有多少可以表示成K个不同的B的幂的和形势.如\(x,y,k,b=15,20,2,2\),则有: \[17= ...

  8. 20180606模拟赛T1——猫鼠游戏

    题目描述: 猫和老鼠在10*10的方格中运动,例如: *...*..... ......*... ...*...*.. .......... ...*.C.... *.....*... ...*... ...

  9. 繁华模拟赛day8 牛栏

    /* 标称并没有用到题解中提到的那种奇妙的性质,我们可以证明,正常从1开始走的话,需要T次,如何使这个次数减小?题解中提到一个办法,有一步小于n/t,我们考虑这一步,如果把它匀到左右两步中,则可以减小 ...

随机推荐

  1. 记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    项目上线以来一直存在一个比较揪心的问题,和一个没有信心处理的BUG,那就是在应用程序启动时有可能会导致cpu跑满99%或持续在一个值如50%左右,这样一来对服务器的压力是非常大的,经常出现服务器无法远 ...

  2. 项目笔记---Socket Error Code翻译

    前言 在项目中为了方便调试及客户反馈,需要Socket错误数字的中文解释,MSDN上只有英文版,同时也想自己学习而且方便将来更新ErrorCode的实际发生的情景,顾有此博文. MSDN:https: ...

  3. IOS 判断日期是今天,昨天还是明天

    git地址: https://github.com/JsoonLi/NSDate-Extension   - (NSString *)compareDate:(NSDate *)date{ NSTim ...

  4. eclipse&android的环境搭建

    这次我选择使用Android来完成这次软件工程实践,不过配置eclipse和android环境真是个麻烦事. 因为之前有用过eclipse,对其比较熟悉,于是就放弃了android studio这个工 ...

  5. 软工实践练习-Git初接触

    第一次听到Git,有点不知所云,听了实践课老师的讲解,才明白了Git作为最先进的分布式版本控制系统的重要性. 至于Git的安装和使用仍旧是自己摸索着去完成了,当然在这过程中也是遇到了很多的问题. 接下 ...

  6. Git 常用命令详解(二)

    Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...

  7. hdu1217 floyd

    floyd一遍即可.如果floyd后值有变大就是 #include<map> #include<string> #include<stdio.h> #include ...

  8. Java 线程并发策略

    1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 2 java中synchronized的用法 用法1 public class Test{ public ...

  9. 【UVA 11078】BUPT 2015 newbie practice #2 div2-A -Open Credit System

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=102419#problem/A In an open credit system, the ...

  10. 关于OOM那些事儿

    最近在aliyun上crontab里放的一个java脚本把机器搞翻了,ssh连不上T_T 发现OOM了,真是无语.并不懂Java的内存模型,转一篇备用吧. 转载自:http://www.cnblogs ...