Gym101158G-Placing Medals on a Binary Tree
题意
一颗完全二叉树,给出n个点,xi的值表示深度为xi的点。问能否在当前状态下使得从根节点到该点的路径中不会遇到其他点。
思路
其实本题的意思就是 1/2,1/4,1/8等等等等,看剩下的点能不能减。然而由于k值并不小,所以long double也无法处理。其实完全二叉树给了启发,也就是如果当前深度的点占据了,相当于之后的子树都不能进行选择了。所以运算方式上类似二进制。相当于利用map对二进制进行模拟。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
int T;
map<int,int>mp;
int n;
void init(){
mp.clear();
}
int main(){
scanf("%d",&n);
int fa = 0,flag = 0,mmax = 0;
init();
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
if(flag==1) printf("No\n");
else if(x>fa){
printf("Yes\n");
mp[x]++;
int cur=x;
while(mp[cur]>1&&cur>fa){
mp[cur]=0;
cur--;
mp[cur]++;
}
while(mp[fa+1]>=1) fa++;
}else if(x==fa){
int f = 0;
for(int i=x;i>=0;i--){
if(mp[i]<2) f = 1;
}
if(mmax>fa&&f) printf("No\n");
else{
printf("Yes\n");
flag=1;
}
}else printf("No\n");
mmax = max(mmax,x);
}
return 0;
}
原文地址:https://www.cnblogs.com/caomingpei/p/9637589.html
时间: 2024-10-18 04:23:54