202312 CSP认证 | 树上搜索

树上搜索

这题算是寒假期间自己先写了一遍,当时是20分超时了
当时的存储思路是,存储每一个节点的所有后代节点,然后在找到wsigma最小的节点之后用的集合操作。这导致了一个问题:
更新维护成本很高。每删除一个分支,都要从当前节点向上回溯,删去后代节点集合中的 该节点编号及该节点后代节点集合。而且对于最后的候选集合也是采用的这种清空,又做集合减法的操作,十分耗时,所以可能逻辑没有问题但是最后超时只有20分。

再写的过程中参考了该博主的写法:202312-3 csp树上搜索

由于维护成本很高所以干脆不去维护。只是给每个节点设定一个是否可用的bool值,如果该节点不可用,则搜索到该节点的时候直接跳过,那么该节点的所有后代节点也不会被搜索(后代节点需要在该节点的基础上递归下去)。在搜索上采取了深搜的方式(为了计算每个节点的后代权重和,在这里选择了用迭代方法计算)。在存储方式上,不再存储所有的后代节点,而只存储下一层的节点(一层层的向下搜索)

从官网结果看非常可观,证明这颗搜索树其实深度不算大,不会在迭代中耗时过多。以下先给出官网的满分代码:
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2010;
int n;
struct node{int pa;   //上级类别ll wt = 0;  //后代的重量 + 自重unordered_set<int> child;   //这里只存储它的次级类别
};
int we[N];
node tree[N];
bool useful[N];   //某个节点及其所有后代节点是否可用
set<int> res;    //用来存储当前还在候选集内的节点!!!再写时因为忘记这个数据结构,在搜索最小的wsigma时遇到问题//计算后代节点以及自重
ll cal_wt(int root)
{ll w = 0;res.insert(root);   //只要被计算重量说明当前节点没有被删除,加入候选集和for(auto ch : tree[root].child){if(!useful[ch]) continue;w += cal_wt(ch);}tree[root].wt = w + we[root];   //后代加上自重return tree[root].wt;
}int FIND(ll sum)
{//直接找候选集里面的ll MAX = LONG_LONG_MAX, index = -1;for(auto x : res){ll wsigma = abs(sum - 2 * tree[x].wt);if(wsigma < MAX){MAX = wsigma;index = x;}}return index;
}
bool judge(int root, int query)
{if(root == query) return true;bool flag = false;for(auto ch : tree[root].child){flag |= judge(ch, query);if(flag) break;}return flag;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int m;cin >> n >> m;for(int i = 1;i <= n;i ++){cin >> we[i];}for(int i = 2;i <= n;i ++){int fa; cin >> fa;tree[fa].child.insert(i);}while(m --){int query; cin >> query;memset(useful, true, sizeof useful);int root = 1;   //初始根节点都是1while(1){res.clear();ll sum = cal_wt(root);   //所有节点的重量if(res.size() == 1) break;   //前一轮它就是找到的Index已经被输出过一遍了int index = FIND(sum);  //找到最小的wsigma值cout << index << ' ';//判断query是否在index后代类别当中if(judge(index, query))  root = index;else useful[index] = false;}cout << endl;}return 0;
}

这其实算是时隔一个月再写这个思路。昨天复写的时候没有用到一个res来存储当前的候选集合,导致找最小值的时候发现不知道要怎么去迭代orz

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

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

相关文章

python 爬虫爬取地理空间高程图GDEMV2 30m 中国地形

一.配置Python 爬虫 环境 from selenium import webdriver import time # from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keys # from selenium.webdriver.comm…

Linux命令总结

1.目录切换 #切换到该目录下 usr 目录 cd usr #切换到上一层目录 cd ../ cd .. #切换到系统根目录 cd / #切换到用户主目录 cd ~ #切换到上一个操作所在目录 cd -2.目录操作 #显示目录中的文件和子目录的列表 ls /usr #目录下的所有目录和文件的详细信息 ll /usr #创建新目录…

【鸿蒙系统】 ---OpenHarmony加快本地编译(二)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序设计参考…

sqlalchemy和moke生成实体类(一)

前言 如果通过java生成实体类&#xff0c;可以通过mybatis或者mybatis-plus的generator。 而sqlalchemy也可以生成实体类&#xff0c;通过sqlalcodegen或者flask-sqlalcodegen。 使用flask-sqlalcodegen生成实体类 建表 建立学生表&#xff0c;如下。 create table stude…

【Android】系统启动流程分析 —— init 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程&#xff0c;准确的说&#xff0c;它是 Linux 系统中用户控制的第一个进程&#xff0c;它的进程号为 1&#xff0c;它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…

Machine Learning - Logistic Regression

目录 一、Activation Function Why introduce activation functions? There are several commonly used activation functions: 二、Sigmoid&#xff1a; 三、Logistic Regression Model&#xff1a; 四、Implementation of logistic regression&#xff1a; 五、Decis…

unity 多屏幕操作

想了解基础操作请移步&#xff1a;&#xff08;重点是大佬写的好&#xff0c;这里就不再赘述&#xff09; Unity 基础 之 使用 Display 简单的实现 多屏幕显示的效果_unity display-CSDN博客 在panel上也可以通过获取 Canvas&#xff0c;来达到切换多屏幕的操作&#xff0c; …

Pear-rec:一键开启多功能捕捉分享,告别繁琐操作!

Pear-rec&#xff1a;一键捕捉每一刻&#xff0c;让每一次分享变得简单高效 - 精选真开源&#xff0c;释放新价值。 概览 Pear-rec是一款采用先进的Electron框架构建&#xff0c;并以ReactJS为前端技术基础的跨平台桌面应用&#xff0c;专注于提供全方位的屏幕捕捉与媒体处理功…

【C++】类与对象(下篇)

在本篇博客中&#xff0c;作者将会讲解类与对象的最后一篇。 一.再谈构造函数 在类与对象&#xff08;上篇&#xff09;中&#xff0c;我们讲到了构造函数&#xff0c;其实构造函数就是给每个成员变量进行赋值&#xff01;&#xff01;&#xff01; 仅仅只是赋值而已&#xf…

阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素。 阿里云2核4G服务器多少钱一年&#xff1f;2核4…

地宫取宝dfs

分析&#xff1a; 矩阵里的每一个位置都有标记&#xff0c;要求的问题是&#xff1a;有几种方法能完成这个规定。 那么&#xff0c;我们只需要计算从开始(1,1)到最后(n,m)的深度优先搜索中&#xff0c;有几个是满足要求的即为正确答案。 有个要求是&#xff0c;如果一个格子中…

Docker-镜像仓库

Docker ⛅Docker-Registry&#x1f320;分类&#x1f320;镜像仓库工作机制&#x1f320;常用的镜像仓库&#x1f320;镜像仓库命令☃️docker login☃️docker pull☃️docker push☃️docker search☃️docker logout &#x1f320;镜像命令[部分]☃️docker images☃️docke…

Git工具的详细使用

一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义&#xff1a;通过定义策略和规则来限制哪些流量能经过防火墙&#xff0c;哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…

【赠书活动】Python编程 从入门到实践 第3版(图灵出品)(文末送书-进行中)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

2-dubbo源码 : 源码环境搭建

好的开始是成功的一半&#xff0c;阅读源码也是一样。 很多同学在下定决心阅读一个开源框架之后&#xff0c;就一头扎进去&#xff0c;迷失在代码“迷宫”中。此时&#xff0c;有同学意识到&#xff0c;需要一边 Debug 一边看&#xff1b;然后又有一批同学在搭建源码环境的时候…

学习C++是否有必要学习Boost库?

C作为一门强大且灵活的编程语言&#xff0c;在软件开发领域有着广泛的应用。而在C的学习过程中&#xff0c;Boost库是一个经常被提及的重要资源。那么&#xff0c;对于C的学习者而言&#xff0c;是否有必要投入精力去学习Boost库呢&#xff1f;本文将就此问题展开详尽讨论。 一…

论文:Zero-Shot Entity Linking by Reading Entity Descriptions翻译笔记(阅读实体描述、实体链接)

文章目录 论文题目&#xff1a;通过阅读实体描述实现零样本实体链接摘要1 介绍2 零点实体链接2.1 审查&#xff1a; 实体链接2.2 任务定义2.3 与其他 EL 任务的关系 3 数据集构建4 实体链接模型4.1 生成候选4.2 候选排序 5 适应目标世界6 实验6.1 基线6.2 对未知实体和新世界6.…

C++例子

#include<iostream> using namespace std;//抽象类 //抽象cpu类 class CPU { public:virtual void calcuate()0; }; //抽象显卡类 class VideoCard { public:virtual void display()0; }; //抽象内存条类 class Memory { public:virtual void storage()0;};//电脑类 clas…