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

news2024/11/15 23:24:07

想查看其他题的真题及题解的同学可以前往查看: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];
}

运行结果: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 全排列(难度⭐⭐)(62)

1. 题目解析 题目链接&#xff1a;46. 全排列 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。当候选解被确认不是一个解&#xff08;或者至少不是最后一…

【QT进阶】Qt http编程之后端API测试工具postman使用介绍

往期回顾 【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等-CSDN博客 【QT进阶】Qt Web混合编程之实现ECharts数据交互动态修改-CSDN博客 【QT进阶】Qt http编程之http与https简单介绍-CSDN博客 【QT进阶】Qt http编程之后端API测试工具postman使用介绍 其实这个工具的…

springboot是什么?

可以应用于Web相关的应用开发。 选择合适的框架&#xff0c;去开发相关的功能&#xff0c;会有更高的效率。 为什么Spring Boot才是你该学的!学java找工作必会技能!在职程序员带你梳理JavaEE框架_哔哩哔哩_bilibili java工程师的必备技能 Spring是Java EE领域的企业级开发宽…

VSCode 目录折叠展开、缩进深度设置

1、VSCode 目录折叠展开设置 运行 Visual Studio Code &#xff0c;按 Ctrl &#xff0c;打开设置 输入Explorer:Compact Folders&#xff0c;取消勾选 或者在设置文件上添加 "explorer.compactFolders": false2、VSCode 目录缩进深度设置 输入Workbench Tree:…

计算机视觉——OpenCV Python位运算与图像掩码

概述 位运算与图像掩码的结合允许对图像的特定区域进行精确的操作。通过使用位运算&#xff08;如AND、OR、XOR和NOT&#xff09;&#xff0c;可以基于掩码的选择性地修改图像数据。位运算与图像掩码结合使用的一些关键点和应用场景&#xff1a; 选择性修改&#xff1a; 通过位…

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

PSNR PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用的评价图像质量的指标,尤其在图像压缩和图像处理领域。它基于最大可能的图像信号功率和图像的噪声功率之间的比率,通常用于衡量图像恢复或图像压缩算法的效果。 原理 PSNR是基于MSE(Mean Squared Error,均…

【网站项目】高校毕业论文管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【java解决线程间变量不可见性的方案】

解决线程间变量不可见性的方案 一、 背景 所有的实例变量和类变量都存储在主内存&#xff0c;但每个线程都有自己的工作内存&#xff0c;保留了主内存的共享变量的副本&#xff0c;线程修改的是共享变量&#xff0c;但是每个线程每次只能读取工作内存里的值&#xff0c;所以会…

Flink窗口机制

1.窗口的概念 时间是为窗口服务的。窗口是什么&#xff1f;为什么会有窗口呢&#xff1f; &#xff08;1&#xff09;Flink要处理的数据&#xff0c;一般是从Kafka过来的流式数据&#xff0c;如果只是单纯地统计流的数据量&#xff0c;是没办法统计的。 &#xff08;2&#xff…

2024蓝桥杯每日一题(组合计数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;计算系数 试题二&#xff1a;求组合数1 试题三&#xff1a;求组合数2 试题四&#xff1a;杨辉三角形 试题一&#xff1a;计算系数 【题目描述】 给定一个多项式 (axby)k&#xff0c;请…

Google Earth Engine 洪水制图 - 使用 Sentinel-1 SAR GRD

Sentinel-1 提供从具有双极化功能的 C 波段合成孔径雷达 (SAR) 设备获得的信息。该数据包括地面范围检测 (GRD) 场景,这些场景已通过 Sentinel-1 工具箱进行处理,以创建经过校准和正射校正的产品。该集合每天都会更新,新获得的资产会在可用后两天内添加。 该集合包含所有 G…

【研发管理】产品经理知识体系-产品创新管理

导读&#xff1a; 产品创新管理对企业的发展具有深远的影响&#xff0c;它不仅是企业保持竞争优势的关键&#xff0c;也是推动企业持续稳定发展的重要动力。因此&#xff0c;企业应高度重视产品创新管理&#xff0c;并采取有效的策略和方法来推动产品创新活动的开展。对于产品经…

.NET 邮件发送 SMTP邮件发送

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是用于电子邮件传输的规则集&#xff0c;可以从邮件客户端向接收电子邮件服务器发送、中继或转发邮件。发件人可使用SMTP 服务器来执行发送电子邮件的过程。SMTP服务器则是按照这些规则中转电子邮件的服务器。 IMAP…

Java web应用性能分析之【MySQL安装注意事项】

本文主要是针对以前LAMP&#xff0c;以及默认用apt安装的mysql。数据文件、日志文件都在一起&#xff1b;innodb_buffer_pool默认用128M。如果你排查问题&#xff0c;最后发现是因为mysql的安装配置不对&#xff0c;是否一口老血要喷出来。同时给MySQL数据库安装做参考。 关于M…

Docker - HelloWorld

原文地址&#xff0c;使用效果更佳&#xff01; Docker - HelloWorld | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-helloworld.html 开始之前 在学习本小节之前&#xff0c;你必须确保你正确安装了 Docker&#xff0c;正确安装 Docker 是后续学习的…

【树莓派学习】hello,world!

系统安装及环境配置详见【树莓派学习】系统烧录及VNC连接、文件传输-CSDN博客 树莓派内置python3&#xff0c;可以直接利用python输出。

linux中如何挂载yum云仓库进行软件的安装

1.首先在根目录下建立文件&#xff0c;用来挂载镜像文件 [rootclient ~]# mkdir /rhel9 2.挂载镜像文件&#xff1a; [rootclient ~]# mount /dev/cdrom /rhel9 3.切换到 /etc/yum.repos.d 下的目录并查看 &#xff0c;创建 rhel9.repo文件&#xff0c;并编辑云仓库域名&am…

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测&#xff08;单一传感器&#xff09; 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士&#xff0c;担任《Mechanical System and Signal Processing》等期刊审稿专家&#xff0c;擅长领域&#xff1…

HCIP-Datacom-ARST必选题库_10_IPv4【1道题】

一、单选 1.IPV4报文发送方式包括哪三种? 任意播组播单播广播 2.如图所示是一个IP报文头部,则以下说法正确的是? 协议号51,代表该IPHeader后的报文为AH头部 该报文一定是只有AH装的IPsecVPN报文 协议号51,代表该IPHeader后的报文为ESP头部 该报文为Ipsec VPN报文,并且该报文…

【NRND】SCT2401 4.5V-40V输入,600mA同步降压DCDC变换器,建议使用LGS5148替代

DCDC丝印2401替代原因&#xff1a; 国产器件未提供中文说明书&#xff0c;截止到2024年4月20日。 批量价格约9毛&#xff0c;比LGS5148贵50%&#xff0c;且输入电压没有LGS5148高&#xff0c;而LGS5148还提供了中文说明书。 2者引脚定义相同。 LGS5148详情请点此处打开CSDN连接…