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取双优值