Gym101158G Placing Medals on a Binary Tree(二进制模拟)

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;
} 

猜你喜欢

转载自www.cnblogs.com/caomingpei/p/9637589.html
今日推荐