题面

Description

从前有 nnn 块石头排成一排,编号从111到nnn。有 nnn 只青蛙站在这 nnn 块石头上,其中编号为 iii 的青蛙站在编号 iii 的石头上。

这 nnn 只青蛙有一个秘密计划,在某个风和日丽的早上,它们同时起跳,编号为 iii 的青蛙跳到编号为 pip_ipi​ 的石头上。跳跃之后,每个石头上仍然有且仅有一只青蛙。即: pip_ipi​ 为一个 111 到 nnn 的全排列。

天上有颗卫星,可以监控青蛙的跳动。由于一些技术原因,卫星只能提供有限的信息:对于 (i,i+1)(i,i+1)(i,i+1) 区间(其中 1≤i&lt;n1≤i&lt;n1≤i<n),有多少只青蛙经过此区间。例如:一只青蛙从编号为444的石头跳到编号为111的石头,它将依次经过 (3,4)(3,4)(3,4), (2,3)(2,3)(2,3), (1,2)(1,2)(1,2) 共三个区间。

我们想根据卫星提供的信息还原出每只青蛙跳到哪块石头上(即 pip_ipi​ )。

Input

第一行一个整数 nnn ,表示青蛙数量 (2≤n≤2×105)(2≤n≤2×10^5)(2≤n≤2×105)

第二行包含 n−1n−1n−1 个整数 a1,a2,⋯an−1(0≤ai≤2×105)a_1,a_2,⋯a_{n−1}(0≤a_i≤2×10^5)a1​,a2​,⋯an−1​(0≤ai​≤2×105) ,其中 aia_iai​ 表示有多少只青蛙经过 (i,i+1)(i,i+1)(i,i+1) 区间。

Output

如果不存在跳跃方案,输出No

否则在第一行输出Yes,第二行输出 nnn 个整数 p1,p2,⋯,pnp_1,p_2,⋯,p_np1​,p2​,⋯,pn​ 。如果有多组解,输出任意一种。

Sample Input & Sample Output

【样例输入1】

5
2 4 2 2

【样例输出1】

Yes
4 3 2 5 1

【样例输入2】

4
1 2 3

【样例输出2】

No

HINT

【数据范围与约定】

子任务1(101010分): 1≤n≤101≤n≤101≤n≤10

子任务2(404040分): 1≤n≤20001≤n≤20001≤n≤2000

子任务3(505050分): 1≤n≤2×1051≤n≤2×10^51≤n≤2×105

题解

首先注意到一个性质:每一个a[i]a[i]a[i]都得是偶数(如果左边跳一只青蛙到右边,则右边必定有一只青蛙跳到左边,这样会使a[i]a[i]a[i]加两次)。

然后,我们考虑相邻的两个aaa:a[i−1]a[i-1]a[i−1]与a[i]a[i]a[i]。

它们只能有这三种关系:

  1. a[i−1]=a[i]a[i-1]=a[i]a[i−1]=a[i]

  2. a[i−1]+2=a[i]a[i-1]+2=a[i]a[i−1]+2=a[i]

  3. a[i−1]−2=a[i]a[i-1]-2=a[i]a[i−1]−2=a[i]

来逐一解释一下:

  1. a[i−1]=a[i]a[i-1]=a[i]a[i−1]=a[i]

    这说明青蛙越过这两个区间的合法情况是这样的:

    (其中的红线代表青蛙跳跃的路线)

    即如果有青蛙经过区间(i−1,i)(i-1,i)(i−1,i),它必定要经过(i,i+1)(i,i+1)(i,i+1),否则a[i−1]≠a[i]a[i-1]\neq a[i]a[i−1]̸​=a[i]。而由于题目要求输出任意一种方案,我们不妨令青蛙iii跳到了原地。

  2. a[i−1]+2=a[i]a[i-1]+2=a[i]a[i−1]+2=a[i]

    还是画个图先:

    意思就是,该经过的还是两个都得经过,不过iii要往右跳,另一个人要从右边跳到iii,这样才能使得a[i]=a[i−1]+2a[i]=a[i-1]+2a[i]=a[i−1]+2。而由于题目要求输出任意一种方案,我们不妨设iii与右边的某只青蛙互换了位置。然后我们将iii插入一个栈里面。

  3. a[i−1]−2=a[i]a[i-1]-2=a[i]a[i−1]−2=a[i]

    图:

    意思就是,该经过的还是两个都得经过,不过iii要往左跳,另一个人要从左边跳到iii,这样才能使得a[i]=a[i−1]−2a[i]=a[i-1]-2a[i]=a[i−1]−2。而由于题目要求输出任意一种方案,我们不妨设iii与左边的某只青蛙互换了位置。所以我们取栈顶的元素,这个元素xxx代表着xxx要与xxx右边的某个元素交换位置,而由于我们是从小到大循环遍历iii的,所以第iii只青蛙刚好符合条件。所以xxx与iii互换位置(p[i]=x,p[x]=ip[i]=x,p[x]=ip[i]=x,p[x]=i)。

最后把p[i]p[i]p[i]输出了就好了。

代码如下:

#include<bits/stdc++.h>#define N 200010using namespace std;int n,a[N],p[N],st[N],top;void NO()
{puts("No");exit(0);
}int main()
{scanf("%d",&n);for(int i=1;i<n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++){if(a[i]==a[i-1])//自己跳自己p[i]=i;else if(a[i]==a[i-1]+2)//i往右跳 st[++top]=i;else if(a[i]==a[i-1]-2)//i往左跳{if(!top)//i往左跳,如果左边没人跳过来,就说明i跳不过去 NO();p[st[top]]=i;p[i]=st[top--];}elseNO();//因为每一个a[i]得是偶数且与相邻两个的相差不超过2,其他情况不符合 }if(top)//栈里还有青蛙要往右跳,说明不合法 NO();puts("Yes");for(int i=1;i<=n;i++)printf("%d ",p[i]);return 0;
}

【XSY2271】青蛙(栈)相关推荐

  1. 由递推关系式用差分方程的方法得到通项公式实现求斐波那契数列的第n项;迭代、递归、栈、差分方程之间的本质联系以及由推广的迭代法解决“变态青蛙跳台阶”问题;汉诺塔问题的数字特征以及用递归解决的原理推导。

    最近几天在研究算法中一个比较基础且突出的问题,就是关于"递推关系式.递归.迭代.序列前k项和"之间的区别与联系. 一.斐波那契数列与差分方程 首先我们考察一个经典的算法,求斐波那契 ...

  2. python术语中英对照栈图_Python常用技术栈总结

    在python的基础上,加入了自己的理解,修改一些错误.最近准备去一线城市谋求发展,所以打算重新整理一下,顺便加深一下记忆. Table of Contents Python语言特性 1 Python ...

  3. Java小青蛙跳台街,青蛙跳台阶问题:Java版,递归算法和循环

    青蛙跳台阶 青蛙跳台阶,青蛙每一次可以跳1阶或2阶,假设有n阶台阶,青蛙要跳完所有台阶,有多少种跳法? 引入斐波那契数列 对于斐波那契数列,百度百科是这么解释的: 斐波那契数列(Fibonacci s ...

  4. C++面试题-青蛙跳台阶的2种解法

    文章目录 前言 实现代码 结果验证 前言 分享一道算法面试题.题目描述如下: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法? 当然各种编程语言都是可以实现的 ...

  5. 青蛙跳台阶问题暨斐波那契数列

    1.问题描述 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 2.问题分析 设 f(n) 表示青蛙跳上 n 级台阶的跳法数.当只有一个台阶时, ...

  6. java青蛙_跳青蛙的求解Java实现

    今天好朋友给我发了一个跳青蛙的智力题: 让左右两边的青蛙交换位置. 要求: 1:用鼠标点青蛙头部,它会向前跳: 2:它最多只能跳过一个青蛙: 3:按红色箭头,游戏复原. 4:此题肯定有解,不要怀疑. ...

  7. 数据结构-青蛙杯棒球比赛

    [题目来自灰灰考研] (青蛙题精选):.青蛙(frog)杯第一届棒球比赛开赛啦. 你现在是一名记分员,输入一个字符串数组(比赛记录情况),按如下规则计分: 1. 如果该字符串是数字:代表当轮比赛的得分 ...

  8. Leetcode 1419:数青蛙(超详细的解法!!!)

    给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合.由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合 ...

  9. DevOps领域少不了这只向前的“青蛙”

    未来每一家公司都将成为软件公司,每一项业务都将成为数字化业务.这意味着软件驱动成为企业发展的"第一性原理". 但是新的问题也接踵而至.企业的软件资产越来越多,据IDC预测,到202 ...

最新文章

  1. node sqlite 插入数据_安卓手机中的应用数据都保存在哪些文件中?
  2. Unix网络编程 提高 TCP I/O 性能的3点经验
  3. nodejs事务使用总结
  4. 视频播放页php,html jquery简易视频播放器
  5. css img 适配尺寸_如何解决img标签下面的小空隙(附详细视频教程)
  6. 计算机组成800H是多大,73计算机组成原理模拟题三(2019年)更新北理工20春答案...
  7. C# 多线程系列(二)
  8. fastjson.toJSONString字段排序
  9. apollo权限管理
  10. 常用 Git 命令清单(阮一峰)
  11. Schlumberger.SPAN.Rock.v9.1.5 1CD跨度岩石强调岩石射孔分析软件
  12. Visual Studio2010安装教程
  13. 使用AST进行JavaScript反混淆(2022年增值税发票查验js)
  14. Unity导入免费的素材资源
  15. 1039: 绝对值最大(C语言)
  16. 数据可视化实验一之单变量数据的统计图表可视化
  17. 独立产品灵感周刊 DecoHack #022 - 截图应用如何在一个月收入 8000 美元
  18. HEVC 高级运动向量预测技术(AMVP)
  19. 地图标记(学习笔记)
  20. Leetcode1407. 排名靠前的旅行者

热门文章

  1. python办公自动化之word表格跨页断行-AllowBreakAcrossPages
  2. Python 中的多进程(进程之间的通信)
  3. java毕业生设计在线点餐系统计算机源码+系统+mysql+调试部署+lw
  4. 拖拽功能之水平拖动图片
  5. ajax 异步刷新表格
  6. linux怎么sftp传文件,Linux 如何使用SFTP命令传输文件
  7. 网络最大流和最小费用流
  8. 计算机求职简历考试题题大学,大学计算机基础上机实验指导与习题,word的设计性实-个人简历.docx...
  9. k近邻算法——kd树
  10. 神经网络(Neural Networks)