当前位置: 首页 > ds >正文

构造+简单树状

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

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

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

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

#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();//队列最前面的先popfor(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

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

#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;
}
/***/

http://www.xdnf.cn/news/5668.html

相关文章:

  • 搜索二维矩阵 II 算法讲解
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——gnutls
  • AD开启交叉选择功能,只选中器件,不选中网络、焊盘
  • PostgreSQL 序列(Sequence) 与 Oracle 序列对比
  • 聊一聊常见的超时问题:timeout
  • 理解CNN模型:从原理到应用
  • Linux系列(3)----用户和用户组管理、系统管理
  • 大模型核心基础简介
  • JAVA笔记6——异常
  • 【我的创作纪念日】512
  • Error from server (NotFound) namespaces kubesphere-system not found报错解决方案
  • 解锁仓储升级:Canopen到Profinet网关的革新应用!
  • 连续抵消解码器--Successive Cancellation decoder(SC 解码器)
  • MNIST 数据并行 Data Parallel - DP
  • P4933 大师
  • ROS 2 FishBot PID控制电机代码
  • ‌中继器:网络中的“血包”与“加时器”‌
  • 【python编程从入门到到实践】第六章 字典
  • 将PyQt5设计的程序打包成.exe文件
  • 掌握 void 类型在函数返回值中的应用
  • 企业级数据安全实践:ChatBI的多源异构治理与OLAP查询加速方案
  • Java中的JDK7和JDK8时间类详解
  • Zotero文献管理
  • Nginx重写功能
  • 使用Python调用ComfyUI API实现图像生成
  • Java+MySQL学生管理系统
  • 【github分享】开发者学习路线图
  • DBdoctor:一款企业级数据库性能诊断工具
  • 什么是 ANR 如何避免它
  • Java 程序流程控制篇