题意:有一颗无穷大的满二叉树,我们向树上节点放置奖牌,奖牌排斥的条件为:从该节点到根的路径上无其他奖牌。
题解:我们可以得知,一个节点放置奖牌之后,这个节点的子树都不能放置奖牌,并且当两个相同深度的节点都放置奖牌之后,其父节点的子树不能放置奖牌。我们用1表示该节点的子树不能放置奖牌。我们可以维护这个序列。
由此可得:
①若放置深度小于最长连续的均为1的深度,则该奖牌不能放置。
②若放置深度等于最长连续的均为1的深度,并且无更深节点放置奖牌,该奖牌可以放置,且以后的所有奖牌均不能放置。
③若放置深度等于最长连续的均为1的深度,并且有更深节点放置奖牌,则不能放置该奖牌。
④若放置深度大于最长连续的均为1的深度,该奖牌可以放置,并更新最长连续深度。
AC代码:
#include<stdio.h> #include<map> #include<iostream> using namespace std; map<int,int>mp; int main() { int n; scanf("%d",&n); int ma=0,flag=0,maa=0; for(int i=0;i<n;i++) { int k; scanf("%d",&k); if(flag) { printf("No\n"); continue; } if(k>ma) { printf("Yes\n"); mp[k]++; int now=k; while(mp[now]>1&&now>ma) { mp[now]=0; now--; mp[now]++; } while(mp[ma+1]>=1)ma++; } else if(k==ma) { if(maa>ma)printf("No\n"); else { printf("Yes\n"); flag=1; } } else printf("No\n"); maa=max(maa,k); } }