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

Posted caomingpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
        else if(x>fa){
            printf("Yes
");
            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
");
            else{
                printf("Yes
");
                flag=1;
            }
        }else   printf("No
");
        mmax = max(mmax,x);
    }
    
    return 0;
} 

以上是关于Gym101158G Placing Medals on a Binary Tree(二进制模拟)的主要内容,如果未能解决你的问题,请参考以下文章

codeforce 985A Chess Placing(暴力)

UVA 10859 - Placing Lampposts 树形DP取双优值

Bailian1664 Placing apples递推+记忆化递归

UVA - 10859 Placing Lampposts

UVA10859Placing Lampposts

LightOj 1230 Placing Lampposts(树形DP)