AT_joisc2015_e 题解

1|0AT_joisc2015_e

传送门 更好的阅读体验

1|0题意

给定长为 n1 的数组 bi,要求有多少长为 n 的数组 ai 满足:

  1. b 数组可以由 a 数组删掉一个数得到。
  2. 存在一个排列 p 满足 ai 是以 pi 结尾的最长上升子序列长度。

1|0思路

可能算是结论题。

首先考虑如果我们知道了 A 数组,如何判断是否合法。可以发现条件是 aipremaxi1+1

证明的话可以考虑设 ai=k,我们取 aj=k1 的最大的 j,只要将 hi 设为比 hj 稍大,即 i,j 中间不存在 k 满足 hj<hk<hi 即可,这是容易实现的。

然后考虑计数。

  1. 如果存在一个位置 i 使得 bi>premaxi1+2,那么显然无解。
  2. 如果存在一个位置 i 使得 bi=premaxi1+2,那么只能有一个这样的位置,同时 premaxi1 这个数可以填在最小的满足 bj=premaxi1ji 之间的位置。
  3. 否则除开最后一个位置,每个位置 i 前有 premaxi1 个数可以填(不 +1 是为了防止有重复),最后一个位置可以填 premaxn1+1 个数,累加起来就是答案。

复杂度 O(n)

代码比较简单:

const int N=1005001; int n,a[N]; int main(){ n=read(); for(int i=1;i<n;i++)a[i]=read(); long long ans=0; int maxn=0,pos=0; for(int i=1;i<n;i++){ if(a[i]-maxn>2){ cout<<0<<endl; return 0; } if(a[i]-maxn==2){ maxn=a[i]; for(int j=i+1;j<n;j++){ if(a[j]-maxn>1){ cout<<0<<endl; return 0; } maxn=max(maxn,a[j]); } cout<<i-pos<<endl; return 0; } ans+=maxn; if(a[i]>maxn)maxn=a[i],pos=i; } cout<<ans+maxn+1<<endl; return 0; }

__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/17933385.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示