题解 | #[NOIP2004]FBI树#

[NOIP2004]FBI树

https://ac.nowcoder.com/acm/problem/16660

可以用线段树来写,注意打印时是后序遍历:先左递归,后右递归,最后输出中间即可。 代码如下:

#include <bits/stdc++.h>
using namespace std;

#define MAXN 1025
char arr[MAXN];
char FBI[MAXN << 2];
string s;
void up(int i){
    int l = i << 1, r = i << 1 | 1;
    if(FBI[l] == FBI[r]){
        FBI[i] = FBI[l];
    }else{
        FBI[i] = 'F';
    }
}
void build(int l, int r, int i){
    if(l == r){
        FBI[i] = s[l] == '1' ? 'I' : 'B';
    }else{
        int mid = (l + r) >> 1;
        build(l, mid, i << 1);
        build(mid + 1, r, i << 1 | 1);
        up(i);
    }
}
void print(int l, int r, int i){
    if(l == r){
        printf("%c",FBI[i]);
    }else{
        int mid = (l + r) >> 1;
        print(l, mid, i << 1);
        print(mid + 1, r, i << 1 | 1);
        printf("%c",FBI[i]);
    }
}
int main(){
	int n;
    scanf("%d", &n);
    n = (1 << n);
    cin >> s;
    s = " " + s;
    build(1, n, 1);
    print(1, n, 1);
	return 0;
}
全部评论
可以啊up,你这个思维能力感觉至少是区域赛银牌水准了呀!?!??
3 回复 分享
发布于 2025-11-22 17:31 天津
Orz!!!!!!!!!
2 回复 分享
发布于 2025-10-08 14:23 湖北

相关推荐

不愿透露姓名的神秘牛友
2025-12-08 17:10
拼多多 算法 38x18 大专
李橙子:你的白菜价我做梦都遥不可及
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务