构造+简单树状

昨日的牛客周赛算是比较简单的,其中最后一道构造题目属实眼前一亮。

倒数第二个题目也是一个很好的模拟题目(考验对二叉树的理解和代码的细节)

给定每一层的节点个数,自己拟定一个父亲节点,构造一个满足条件的二叉树。

其实最简单的构造就是1为父亲节点,随后慢慢的往后将节点堆上去。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node {
    int l, r;
};
//构造每个节点,拟定左孩子,右孩子
signed main() {
    int n; cin >> n;
    vector<int> a(n + 1);
    int sum=0;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        sum+=a[i];
        //找到所有节点个数
    }
    vector<node> tree(sum+1, {-1, -1});
    //先初始化所有的节点,左右节点都是(-1,-1)
    int answer = 1;
    queue<int> q;
    q.push(answer++);
    //用队列来模拟上一层的节点
    for (int i = 2; i <= n; i++) {
        int j = a[i];
        //j是当前节点的个数
        int cnt = a[i - 1];
        for (int oi = 1; oi <= cnt; ++oi) {
            if (q.empty()) break;
            //特判,队列为空
            int nima = q.front();
            q.pop();
            //队列最前面的先pop
            for(int k=1;k<=2;k++){
                //左右塞孩子
                if (answer <= sum && j > 0){
                    //answer就是节点
                    if(k==1)tree[nima].l = answer;
                    else tree[nima].r = answer;
                    q.push(answer++);
                    //塞完了以后就放到队列里面为下一层做准备
                    j--;
                    //当前节点自减
                }
            }
        }
    }
    cout<<1<<endl;
    for (int i = 1; i <= sum; ++i) {
        cout << tree[i].l << " " << tree[i].r << endl;
    }
}

第二个构造题目的核心思想就是认识到0的作用和,m,n在什么条件下有答案。

手动模拟之后发现,3,7,11,15(m+n)的条件下有答案,所以第一步我们直接进行特判

随后我们想如何往里面塞数字

当n=1的时候,直接从n+1开始一直往后塞数字到m+n

当n>=2的时候,我们前面(n-1)行(除了最后一个数字)都塞0

如 当输入是3 4的时候

我们可以进行如下构造

0 0 0 1

0 0 0 2

4 5 6 4

对最后一排进行特殊照顾 先塞4 5 6 7(最后在对7进行转换)7^1^2^...(n-1)

前面的就直接对最后一个数字从1开始赋值到n-1

总结:很好的一个构造思路想法,当作经验包.....

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int op=501;
int a[op][op];
inline void solve() {
    int n, m;
    cin >> n >> m;
    if ((n + m) % 4 != 3) {
        cout << -1 << endl;
        //进行特判
        return;
    }
    vector<int> r(n+1), c(m+1);
    for (int i = 1; i <= n; i++) r[i] = i;
    for (int j = 1; j <= m; j++) c[j] = n + j;
    for (int i = 1; i <= n - 1; i++) {
        a[i][m] = r[i];//对前n-1行最后的数字从1开始塞
    }
    int answer=0;
    for (int j = 1; j <= m - 1; j++) {
        a[n][j] = c[j];
        //对最后一行进行塞
        answer^=c[j];
    }
    a[n][m] = r[n] ^ answer;
    //对最后一个数字进行特判
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
}
signed main() {
    int t=1;
    while (t--)
        solve();
    return 0;
}
/*
 *
 */
相关推荐
CoovallyAIHub1 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub2 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub2 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub3 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub3 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞3 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想
徐小夕4 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
CoovallyAIHub5 小时前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub6 小时前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉
zone77396 小时前
002:RAG 入门-LangChain 读取文本
后端·算法·面试