CCF-CSP真题《202312-3 树上搜索》思路+c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全

问题描述

试题编号:202312-3
试题名称:树上搜索
时间限制:1.0s
内存限制:512.0MB
问题描述:

题目背景

问题描述

输入格式

输出格式

样例1输入

5 2
10 50 10 10 20
1 1 3 3
5
3

样例1输出

2 5
2 5 3 4

样例解释

子任务

真题来源:树上搜索

感兴趣的同学可以如此编码进去进行练习提交

 c++满分题解:

#include <bits/stdc++.h>
using  namespace std;
inline long long read()
{
        long long x = 0, f = 1;
        char c = getchar();
        while (c < '0' || c > '9')
        {
                if (c == '-') f = -1;
                c = getchar();
        }
        while ( c >= '0' && c <= '9')
        {
                x = x * 10 + c - '0';
                c = getchar();
        }
        return x * f;
}

struct Node
{
        long long Weight;
        long long WeightSum;
        long long Index;
        bool IsOut;
        Node* Child, * Brother, * Above, * LastChild, * PrevBrother;
        Node(long long Weigh, long long i) : Weight(Weigh), Child(nullptr), LastChild(nullptr), Above(nullptr), Brother(nullptr), WeightSum(Weigh), PrevBrother(nullptr), Index(i) {}
};

Node* Nodes[2010];

void LinkNode(Node* Parent, Node* Child)
{
        if (!Parent || !Child) return;
        Child->Above = Parent;
        if (!Parent->Child)
        {
                Parent->Child = Child;
                Parent->LastChild = Child;
                return;
        }
        Parent->LastChild->Brother = Child;
        Child->PrevBrother = Parent->LastChild;
        Parent->LastChild = Child;
}


long long AccWeights(Node* CurRoot)
{
        if (!CurRoot) return 0;
        CurRoot->WeightSum = CurRoot->Weight;
        Node* CurNode = CurRoot->Child;
        while (CurNode)
        {
                CurRoot->WeightSum += AccWeights(CurNode);
                CurNode = CurNode->Brother;
        }
        return CurRoot->WeightSum;      
}

bool HasTarIndex(Node* Root, long long Tar)
{
        if (!Root) return 0;
        else if (Root->Index == Tar) return 1;
        Node* CurNode = Root->Child;
        while(CurNode)
        {
                if (HasTarIndex(CurNode, Tar)) return 1;
                CurNode = CurNode->Brother;
        }
        return 0;
}

long long RemovedParents[2010]{-1}, RemovedChilds[2010]{-1};
long long RemovedPairs = 0;
void RemoveNode(Node* TarNode)
{
        if (!TarNode) return;
        if (!TarNode->PrevBrother) TarNode->Above->Child = TarNode->Brother;
        else TarNode->PrevBrother->Brother = TarNode->Brother;
        if (!TarNode->Brother) TarNode->Above->LastChild = TarNode->PrevBrother;
        else TarNode->Brother->PrevBrother = TarNode->PrevBrother;
        TarNode->Above = nullptr;
        TarNode->Brother = nullptr;
        TarNode->PrevBrother = nullptr;
}
void ReBuild()
{
        for (long long i = 0; i < RemovedPairs; ++i) LinkNode(Nodes[RemovedParents[i]], Nodes[RemovedChilds[i]]);
        RemovedPairs = 0;
}
long long GetDelta(Node* TarNode, long long& CurTotalWeight)
{
        if(!TarNode) return 114514;
        else if (!TarNode->Above) return TarNode->WeightSum;
        return abs(CurTotalWeight - 2 * TarNode->WeightSum);
}
long long CurMin = 0, CurIdx = 0;
void Bianli(Node* CurRoot, long long& CurTotalWeight)
{
        if (!CurRoot) return;
        long long Delta = GetDelta(CurRoot, CurTotalWeight);
        //cout << CurRoot->Index << ' '<<Delta<<'\n';
        if (Delta < CurMin || (CurMin == Delta && CurRoot->Index < CurIdx))
        {
                CurMin = Delta;
                CurIdx = CurRoot->Index;
        }
        Node* CurNode = CurRoot->Child;
        while (CurNode)
        {
                Bianli(CurNode, CurTotalWeight);
                CurNode = CurNode->Brother;
        }
}
void PrintTree(Node* CurRoot)
{
        if (!CurRoot) return;
        cout << CurRoot->Index << '\n';
        Node* CurNode = CurRoot->Child;
        while (CurNode)
        {
                cout << '\t' << CurNode->Index << '\n';
                system("pause");
                CurNode = CurNode->Brother;
        }
        CurNode = CurRoot->Child;
        while (CurNode)
        {
                PrintTree(CurNode);
                CurNode = CurNode->Brother;
        }
}
int main()
{
        long long n = read(), m = read();
        for (long long i = 1; i<= n; ++i) Nodes[i] = new Node(read(), i);
        for (long long i = 2; i <= n; ++i) LinkNode(Nodes[read()], Nodes[i]);
        long long Index = 0;
        for (long long i = 1; i <= m; ++i)
        {
                RemovedPairs = 0;
                Index = read();
                Node* CurRoot = Nodes[1];
                while(CurRoot->Child)
                {
                        /*
                        cout << "___________________\n";
                        PrintTree(CurRoot);
                        cout << "___________________\n";
                        */
                        long long SumWeight = AccWeights(CurRoot);
                        CurMin = SumWeight, CurIdx = 0;
                        Bianli(CurRoot, SumWeight);
                        cout << CurIdx << ' ';
                        if (HasTarIndex(Nodes[CurIdx], Index)) CurRoot = Nodes[CurIdx];
                        else
                        {
                                RemovedParents[RemovedPairs] = Nodes[CurIdx]->Above->Index;
                                RemovedChilds[RemovedPairs] = Nodes[CurIdx]->Index;
                                ++RemovedPairs;
                                RemoveNode(Nodes[CurIdx]);
                        }
                }
                ReBuild();
                cout << '\n';
        }
        for (long long i = 1; i<= n; ++i) delete Nodes[i];
}

运行结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BioTech - 使用 Amber 工具 松弛(Relaxation) 蛋白质三维结构 (Python)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/137889532 Amber 工具在蛋白质 松弛(Relaxation) 过程中起着重要的作用。在分子动力学模拟中,蛋白质松弛是指模拟过程中蛋白质结构达到一个较为稳定的状态。这个过程通…

SQLite轻量级会话扩展(三十四)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite R*Tree 模块&#xff08;三十三&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 引言 会话扩展提供了一种方便记录的机制 对 SQLite 数据库中某些表的部分或全部更改&#xff0c;以及 将这些…

视频质量评价 SSIM 算法详细介绍

SSIM SSIM(Structural Similarity Index Measure)是一种用于衡量两幅图像之间相似度的指标,是属于全参考视频质量评价算法范畴;它在图像质量评估领域得到了广泛的应用。SSIM是基于人类视觉系统的特性设计的,它考虑了图像的亮度、对比度和结构信息。SSIM的值范围在-1到1之…

xilinx 7系列FPGA时钟布线资源

7系列FPGA拥有多种时钟路由资源&#xff0c;以支持各种时钟方案和需求&#xff0c;包括高扇出、短传播延迟以及极低的偏斜。为了最佳地利用时钟路由资源&#xff0c;需要了解如何将用户时钟从PCB传递到FPGA&#xff0c;确定哪种时钟路由资源最优&#xff0c;然后通过利用适当的…

【数据结构|C语言版】单链表

前言1. 单链表的概念和结构1.1 单链表的概念1.2 单链表的结构 2. 单链表的分类3.单链表的实现3.1 新节点创建3.2 单链表头插3.3 单链表头删3.4 单链表尾插3.5 单链表尾删3.6 链表销毁 4. 代码总结4.1 SLT.h4.2 SLT.c4.3 test.c 后言 前言 各位小伙伴大家好&#xff01;时隔不久…

百科不全书之 docker记录

docker记录 1.参考文件2. Docker简介与虚拟机的区别 3. 安装Docker注意 Windows家庭版的要额外设置 4.使用5.docker与ROS 1.参考文件 参考视频&#xff1a;B站【GeekHour】Docker入门教程: 【GeekHour】30分钟Docker入门教程 2. Docker简介 Docker是一个用于构建运行 传送…

The C programming language (second edition,KR) exercise(CHAPTER 4)

E x c e r c i s e 4 − 1 Excercise\quad 4-1 Excercise4−1&#xff1a; #include <stdlib.h> #include <stdio.h> #include <string.h> int strindex(char s[],char t[]); int strrindex(char s[],char t[]);int main(void) {char s[100]"qwoulddf…

Java | Leetcode Java题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; class Solution {public int firstMissingPositive(int[] nums) {int n nums.length;for (int i 0; i < n; i) {while (nums[i] > 0 && nums[i] < n && nums[nums[i] - 1] ! nums[i]) {int temp nums[nums[i] …

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…

存储竞赛,角逐未来

随着人工智能&#xff08;AI&#xff09;和大数据驱动的海量数据需求&#xff0c;对存储技术的要求也在不断提高。在此背景下&#xff0c;各大存储芯片巨头之间的技术竞赛日益激烈。 在NAND闪存领域&#xff0c;企业关注的重点在于层数的突破。近日&#xff0c;《韩国经济日报》…

linux下编译c++程序报错“undefined reference to `std::allocator<char>::allocator()‘”

问题 linux下编译c程序报错“undefined reference to std::allocator::allocator()”。 原因 找不到c标准库文件。 解决办法 开始尝试给gcc指令添加-L和-l选项指定库路径和库文件名&#xff0c;但是一直不成功&#xff0c;后来把gcc改为g就可以了。

Stylus精讲:网页设计新境界【写作AI一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

SWCTF

easy_php 源码 <?php// flag is in flag.php highlight_file(__FILE__); ini_set(display_errors, 0); error_reporting(0);if (isset($_GET[myon1]) && isset($_GET[myon2]) && isset($_GET[myon3])) {$myon1 $_GET[myon1];$myon2 $_GET[myon2];$myon…

# Win10 打不开【本地组策略编辑器】解决方案

Win10 打不开【本地组策略编辑器】解决方案 段子手168 问题描述&#xff1a; 当在 WIN R 打开【运行】输入&#xff1a;gpedit.msc 打开【本地组策略编辑器】时&#xff0c;出现错误时&#xff0c; 或者在【计算机管理】中 没有【本地用户和组】这一项。 可以试一下以下方…

Go 之 sync.Mutex 加锁失效现象

我先声明一下&#xff0c;并不是真的加锁失效&#xff0c;而是我之前的理解有误&#xff0c;导致看起来像是加锁失效一样。于是乎记录一下&#xff0c;加深一下印象。 我之前有个理解误区&#xff08;不知道大家有没有&#xff0c;有的话赶紧纠正一下——其实也是因为我这块的…

Spec-Gaussian:3D高斯溅射的各向异性视图相关外观

Spec-Gaussian: Anisotropic View-Dependent Appearance for 3D Gaussian Splatting Spec-Gaussian&#xff1a;3D高斯溅射的各向异性视图相关外观 Ziyi Yang1,3  Xinyu Gao1  Yangtian Sun2  Yihua Huang2  Xiaoyang Lyu2 杨子怡 1,3 高新宇 1 太阳扬天 2 黄宜华 2 吕晓阳…

【github主页】优化简历

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages&#xff08;GitHub 常用语言统计&#xff09;使用细则 3、Visitor Badge&#xff08;GitHub 访客徽章&#xff09;4、社交统计5、打字特效6、省略展示小猫 &#x1f…

Java+springboot开发的医院智能导诊服务系统源码 自动兼容小程序与H5版本

智能导诊系统 一、什么是智慧导诊系统&#xff1f; 智慧导诊系统是一种医院使用的引导患者自助就诊挂号、精准推荐科室、引导患者挂号就诊的系统。该系统结合医院挂号及就诊的HIS系统&#xff0c;为患者带来全流程的信息指引提醒&#xff0c;可以在全院区构建一个精细化、移动…

react 项目路由配置(react-router-dom 版本 v6.3、v6.4)

根据 react-router-dom 的版本&#xff0c;有不同的方式 一、react-router-dom v6.3 用到的主要 api: BrowserRouteruseRoutesOutlet 下面是详细步骤&#xff1a; 1、index.js BrowserRouter 用来实现 单页的客户端路由使用 BrowserRouter 包裹 App放在 顶级 位置&#x…

MATLAB初学者入门(7)—— 参数估计

参数估计是利用实验数据来推断模型参数的过程&#xff0c;这在科学和工程领域中非常常见。MATLAB提供了多种工具来进行参数估计&#xff0c;尤其是当模型表现为非线性时。以下是使用MATLAB进行参数估计的一种常见方法&#xff0c;我们将通过一个具体的案例——化学动力学模型的…