码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-12 22:07:15      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:pre   return   不能   int   aci   状态   处理   lse   ==   

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

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

标签:pre   return   不能   int   aci   状态   处理   lse   ==   

原文地址:https://www.cnblogs.com/caomingpei/p/9637589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!