首页 > 编程语言 >程序设计天梯赛个人题解 L2-047-2 锦标赛

程序设计天梯赛个人题解 L2-047-2 锦标赛

时间:2024-02-19 21:24:04浏览次数:38  
标签:比赛 int 题解 tree 胜者 L2 二叉树 孩子 047

题目分析

综合题意,将最后一场比赛视为顶层,第一轮比赛视为第一层,则有:

下层每场比赛选出一个胜者,每两个下层的胜者间举行本层的一次比赛,显然这是一个二叉树。考虑还原建立每场比赛的树。

由于最后一层的比赛是$2^k$个选手参加,故这是个完美二叉树,使用完全二叉树的数组储存方式,则标号为$n$的节点的左孩子标号:$n<<1$,右孩子为$n<<1|1$[1]

对于一场比赛的两位参与者,其分别是这场比赛的左孩子比赛的胜者和右孩子比赛的胜者。
故进行暴力穷举,对于两位参与者ab来说,先考虑a来自左孩子。若不合理,再考虑a来自右孩子。

个人示例代码

#include <iostream>

using namespace std;
typedef long long ll;
// 16min,进步!
const int N = 1 << 19;

struct node
{
    int win;
    int lose;
} tree[N];
// 前k层: 2^k-1
int k;
bool solve(int n) // 还原n号节点的子节点,并检查自身合理性
{
    if (n >= 1 << k)
        return true;
    else if (tree[n].lose > tree[n].win)
        return false;

    tree[n << 1].win = tree[n].win;
    tree[n << 1 | 1].win = tree[n].lose;
    if (solve(n << 1) && solve(n << 1 | 1))
        return true;

    swap(tree[n << 1].win, tree[n << 1 | 1].win);
    if (solve(n << 1) && solve(n << 1 | 1))
        return true;

    return false;
}
int main()
{
    cin >> k;
    for (int i = k; i >= 1; i--)
        for (int j = 1 << (i - 1); j < 1 << i; j++)
            cin >> tree[j].lose;
    cin >> tree[1].win;
    if (solve(1))
        for (int j = 1 << k - 1; j < 1 << k; j++)
            cout << tree[j].win << ' ' << tree[j].lose << " \n"[j == (1 << k) - 1];
    else
        cout << "No Solution" << endl;
    return 0;
}

  1. 位运算中,$n<<1$ 相当于 $n\times2$, $n<<1$作为一个二进制末尾为0的数,$n<<1|1=n \times 2+1$ ↩︎

标签:比赛,int,题解,tree,胜者,L2,二叉树,孩子,047
From: https://www.cnblogs.com/AyeeMinerva/p/18021990

相关文章

  • 洛谷-P3380/LibreOJ-106/BZOJ-3196题解
    题意简述给定一个数列,支持以下操作:查询\(k\)在区间内的排名(区间内比\(k\)小的数的个数\(+1\))查询区间内排名为\(k\)的值修改某一位值上的数值查询\(k\)在区间内的前驱(前驱定义为严格小于\(k\),且最大的数,若不存在输出-2147483647)查询\(k\)在区间内的......
  • U41492 树上数颜色 题解
    U41492树上数颜色题目描述给一棵根为1的树,每次询问子树颜色种类数输入格式第一行一个整数n,表示树的结点数接下来n-1行,每行一条边接下来一行n个数,表示每个结点的颜色c[i]接下来一个数m,表示询问数接下来m行表示询问的子树输出格式对于每个询问,输出该子树颜色数输入输出......
  • P2524 Uim的情人节礼物•其之弐 题解
    题目描述前传:详见洛谷P2525Uim成功地按照顺序将礼物送到了 N 个妹子的手里并维持她们的和谐。现在Uim现在想知道,他最终选择的顺序是所有给 N 个妹子送礼顺序中,字典序第几小的。送礼顺序可以看作1,2,⋯,N 的一个排列。输入格式第一行一个整数N,表示有 N 个数。第二......
  • P3411 序列变换 题解
    自己做不出来,看现在题解区的题解讲的都不咋清楚。懂了之后来为后人铺路。而且我的马蜂比较好看题目传送门我能看懂这道题,主要是依靠了这篇题解的帮助。首先我们只关注数的相对关系,所以可以离散化。注意到值域\(10^6\),用数组离散化。这道题可以用贪心做。(有一些定义先往下看)......
  • P5914 MOS 题解
    一道练习贪心证明的好题。绝大多数题解只是点出了以下结论:要么最快的带最慢的;要么最慢的带次慢的。并没有给出证明。我就补上这个证明。为了证明这个贪心结论,我们先证明几个引理。引理一:每次将火把带回来的,一定是对岸最快的。引理一证明:如果回来的不是对岸最快的,让对岸最......
  • CF167B题解
    CF167B这里更容易进入且有翻译题意给定初始背包容量\(k\),要进行\(n\)场比赛,每场比赛有\(p_i\%\)的概率能够胜利,赢的一场比赛能获得一个奖励——当\(a_i=-1\)时获得一个体积为\(1\)的奖品,或者当\(a_i>0\)时给背包增加\(a_i\)容量,求所有比赛结束后至少赢得\(......
  • 理想的正方形——题解
    题目描述一看正方形,得,二维数组,单调队列。单调队列可以将一个区间最大值存储,所以只需要根据给定的正方形长度先横着推一遍,再竖着推一遍,将正方形中的最大值和最小值都储存在正方形右下角方格,最后遍历即可。先以行储存以k为长度的最大/小值;再以剩下k-m横向长度的最值向下扩展k个......
  • 跨域问题解决
    跨域举例A网站部署在localhost:63343请求loocalhost:8080/api/user/add,就会出现跨域问题。同源策略同源策略:协议,主机,端口,只有这三者全部相同时,才可以相互访问。现在接口地址为101.10.11.1X:8081,请判断以下哪些可以通过:访问地址描述结果https://127.0.0.1:808......
  • 数列的异或和(题解)
    题目样例样例输入5512345113135036113135样例输出0257二进制运算二进制运算的优先级小于四则运算,所以在与四则运算同时出现时,注意加括号按位与(&)在二进制下,相同位的数都为1时,这一位的结果为1,任意一个不是1或都是0,则为0(eg:0100110&0010111=000......
  • 场景问题解决方法
    1.tomcatspringboot通过域名访问时直接跳到127.0.0.1的问题这种情况极可能是因为 server.xml配置问题导致,可以参考这篇文章tomcat设置http代理详细教程-知乎(zhihu.com)2.如何访问内网中所有的服务和站点要访问一个内网中所有的服务和站点(如内网的所有网站和数据库等),......