ssoj2456装饰大楼
【题意】有n个大楼,给你n-1个数a[i]表示位置i之前(包括位置i)有多少栋递增的高楼。问完整序列可能有多少种,也可能无解。
【思路】竟然神游着把a[i]想成高度,推翻了想出来的正解……分三种情况:1、无解:a[i]>max+2或是多个a[i]==max+2;(max∈(a[1]……a[i-1])),无解;2、中间断开:有一个a[i]==max+2;(max∈(a[1]……a[i-1])),用剩下的来补,补在pos之前大于max的空位上;3、有解且不断开:每位有1~max+1个数可插入,重复要删除。
【代码】
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int maxn=1000006;
int n,a[maxn],mx,f=1,hst=0,pos=0,hig;
ll ans=1;
inline int get(){char c;while(!isdigit(c=getchar()));int v=c-48;while(isdigit(c=getchar()))v=v*10+c-48;return v;
}
int main(){n=get();mx=0;for(int i=1;ihst+2){f=0;continue;}if((a[i]==hst+2)&&pos){f=0;continue;}if(a[i]==hst+2)pos=i,hig=hst;hst=max(hst,a[i]);}if(f && !pos)for(int i=1;i
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
