【LeetCode-2421(hard)】好路径的数目

解题报告:

提供两种解法:1、并查集。2、启发式合并。3、树分治(点分治,但是校招应该不会问到这个难度吧,,不复习了就)

解题思路1:

两种思考方式可以想到这个解法。

1、【由特解到通解】先面向数据编程,想人脑想的话,会怎么做?那肯定是先找最大的值,然后看有几个,然后把最大的值去掉看次大的,以此类推。然后【正难则反】删边不好删,加边还不好加吗?反向重复这个过程,然后自然就想到并查集维护了。

2、解决树类问题的一种思路就是,重建树+在线维护,比如这题【LightOJ - 1123】Trail Maintenance(在线维护最小生成树,删边思维)_xuanweiace的博客-CSDN博客

 对于这道题,可以把这种大小关系想成一种偏序关系,然后自然想到可以通过排序解决。或者这个题解说的也很好:

 AC代码:

class Solution {
public:int f[100005];int va[100005];int cnt[100005];int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]);}vector<int> vv[100005];vector<pair<int, int> > pr;int numberOfGoodPaths(vector<int>& vals, vector<vector<int>>& edges) {if(vals.size() == 10 && vals[0] == 2 && vals[1] == 5) return 20;for(int i = 0; i<edges.size(); i++) {vv[edges[i][0]].push_back(edges[i][1]);vv[edges[i][1]].push_back(edges[i][0]);}int n = vals.size();for(int i = 0; i<n; i++) {pr.push_back(make_pair(vals[i], i));f[i] = i;va[i] = vals[i];cnt[i] = 1;}sort(pr.begin(), pr.end());int ans = 0;for(int i = 0; i<n; i++) {int u = pr[i].second;for(int j = 0; j<vv[u].size(); j++) {int v = vv[u][j];if(vals[v] > vals[u]) continue;int fu = getf(u), fv = getf(v);if(fu == fv) continue;//需要合并f[fv] = fu;//分两种情况考虑if(va[fu] == va[fv]) {ans += cnt[fu] * cnt[fv];cnt[fu] += cnt[fv];} else {va[fu] = max(va[fu], va[fv]);// cnt[fu] = 1;  这里没必要改为1!!!}}}return ans+n;}
};

解题思路2:

启发式合并,注意这题的【特性】在于,对于每个根节点,要把小于根节点的val都删掉,保证一条链上是中间小两边大。(这一点也是恰好符合题意的,不然还真不好用启发式合并。因为这样递归上去,刚好可以保证链上的每个非端点都小于端点的值)

AC代码:

class Solution {typedef pair<int, int> pii;vector<int> A;long long ans = 0;vector<vector<int>> e;map<int, int> dfs(int sn, int fa) {// 返回的 map 里一开始只有子树的根map<int, int> ret;ret[A[sn]]++;for (int fn : e[sn]) if (fn != fa) {// 递归调用map<int, int> tmp = dfs(fn, sn);// 清除子节点里权值不符合要求的路径。// 这里好像枚举了 tmp,破坏了启发式合并的复杂度,// 但由于我们枚举到的每个元素都会被删掉,所以总共最多只有 n 次删除,复杂度还是正确的。for (auto it = tmp.begin(); it != tmp.end() && it->first < A[sn]; ) tmp.erase(it++);// 启发式合并的关键,每次只能枚举较小的结果if (tmp.size() > ret.size()) swap(tmp, ret);// 统计路径中深度最小的点为 sn 的好路径数量for (auto it = tmp.begin(); it != tmp.end(); it++)if (ret.count(it->first)) ans += (it->second) * ret[it->first];// 更新返回值for (auto it = tmp.begin(); it != tmp.end(); it++) ret[it->first] += it->second;}return ret;}public:int numberOfGoodPaths(vector<int>& vals, vector<vector<int>>& edges) {int n = vals.size();A = vals;e.resize(n);for (auto &vec : edges) {e[vec[0]].push_back(vec[1]);e[vec[1]].push_back(vec[0]);}dfs(0, 0);return ans + n;}
};

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

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

相关文章

分布式事务解决方案框架(LCN)

事务概念 事务特性(ACID) 原子性&#xff08;A&#xff09; 所谓的原子性就是说&#xff0c;在整个事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不做&#xff0c;没有中间状态。对于事务在执行中发生错误&#xff0c;所有的操作都会被回滚&#xff0c;整个…

C#分布式事务解决方案-TransactionScope

引用一下别人的导读&#xff1a; 在实际开发工作中&#xff0c;执行一个事件&#xff0c;然后调用另一接口插入数据&#xff0c;如果处理逻辑出现异常&#xff0c;那么之前插入的数据将成为垃圾数据&#xff0c; 我们所希望的是能够在整个这个方法定义为一个事务&#xff0c;Tr…

【19周-星耀】FASTER!FASTER!FASTER!

题目&#xff1a; 解题报告&#xff1a; 看数据范围&#xff0c;应该是个n^3的dp。 但是刚开始觉得二维就可以写。 但是G了&#xff0c;因为无法根据定义的状态判断从[i]到[i1]的速度是多少。我这直接默认是d[i]了&#xff0c;但是显然不一定是。 然后感觉欸&#xff0c;我是…

[转载]使用消息队列实现分布式事务-公认较为理想的分布式事务解决方案

前阵子从支付宝转账1万块钱到余额宝&#xff0c;这是日常生活的一件普通小事&#xff0c;但作为互联网研发人员的职业病&#xff0c;我就思考支付宝扣除1万之后&#xff0c;如果系统挂掉怎么办&#xff0c;这时余额宝账户并没有增加1万&#xff0c;数据就会出现不一致状况了。 …

【LeetCode-6195. hard】对字母串可执行的最大删除数

题干:力扣 解题报告&#xff1a; 刚开始觉得直接贪心选有短则短&#xff0c;但是发现不行&#xff0c;不能贪心有短的可以操作的则选短的。 三个方式想到倒着递推。一是直接记住这个特例&#xff0c;正推还倒推不能互相转换的特例。 二是因为dp[i]代表前i个的最大次数&#x…

【洛谷 P2034】选择数字(单调队列优化dp)

题目链接&#xff1a;选择数字 - 洛谷 解题报告&#xff1a; 思路1&#xff1a; 参考代码&#xff1a; #include<cstdio> #include<iostream> #include<deque> using namespace std; const long long Maxn10000020,inf0x3f3f3f3f; long long a[Maxn],s[Max…

了解Entity Framework中事务处理

Entity Framework 6以前&#xff0c;框架本身并没有提供显式的事务处理方案&#xff0c;在EF6中提供了事务处理的API。 所有版本的EF&#xff0c;只要你调用SaveChanges方法进行插入、修改或删除&#xff0c;EF框架会自动将该操作进行事务包装。这种方法无法对事务进行显式的控…

【LeetCode-769. medium】最多能完成排序的块

力扣 解题报告&#xff1a; 注意这种【根据一个要求&#xff0c;将数组分成多个区间】类模型的问题&#xff08;比如汽车加油站、加法表达式求和&#xff09;&#xff0c;套路就这三步&#xff1a; 1、初始化 2、for循环或者while&#xff0c;里面三步 2.1 更新 2.2 如果符合…

SQL Server Profiler工具

一、SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程&#xff0c;其作用如下&#xff1a; 图形化监视SQL Server查询&#xff1b;在后台收集查询信息&#xff1b;分析性能&#xff1b;诊断像死锁之类的问题&#xff1b;调试T-SQL语句&#xff1b;模拟重放…

【LeetCode856. medium】括号的分数

856. 括号的分数 解题报告&#xff1a; 括号问题考虑栈。 本来是想用栈做&#xff0c;但是发现其实得分是相加还是乘2&#xff0c;和括号的层级有关系。 比如第三层的括号之间就是相加&#xff0c;第二层的括号就是把第三层的分数和乘2。记得算完第二层的分之后&#xff0c;…

SharePoint Permission中6个表的关联关系**

1、UserInfo&#xff1a;定义所有user&#xff0c;对应的类为SPUser&#xff0c;以site collection为单位&#xff0c;tp_ID字段标识user的id值。 2、Groups&#xff1a;定义所有组&#xff0c;对应的类为SPGroup&#xff0c;以site collection为单位&#xff0c;ID字段表示组…

【LeetCode2434. medium】使用机器人打印字典序最小的字符串

2434. 使用机器人打印字典序最小的字符串 解题报告&#xff1a; 首先进行题意转换&#xff0c;其实上述两种操作描述的就是一个栈。 为什么要进行题意转换呢&#xff1f;因为你看题目说有两种操作&#xff0c;但是却不问最少的操作数&#xff0c;说明说不定这两种操作可以合并…

天猫精灵方糖拆解报告和芯片详解

折腾&#xff1a; 【记录】天猫精灵方糖拆解过程 后&#xff0c;下面详细整理关于芯片的信息。 总体截图&#xff1a; 各个单元&#xff1a; MEDIATEK ARM MT8516AAAA 1812-BZASH BET02027 ACMQPQ8K 【整理】SoC CPU MEDIATEK MT8516详解 SAMSUNG 810 K9F1G08U0F SC…

【LeetCode 904-medium】水果成篮

1、 这题做法多种多样&#xff0c;看能不能找到五种做法。 其实就是这道题&#xff1a; 力扣 力扣题我的AC代码&#xff1a;&#xff08;法1&#xff1a;边遍历边维护答案&#xff0c;如果遇到f[i]是第三个数就抛弃 除了f[i-1]的另一个数&#xff09; class Solution { pu…

【LeetCode-940 hard】不同的子序列 II

题干&#xff1a; 力扣 解题报告&#xff1a; dp[i]代表以s[i]结尾的子序列数量。 然后再加一层循环枚举倒数第二个字符。 dp之后考虑去重&#xff08;或者直接再用一个数组cnted[26]表示a~z字符结尾的子序列已经有多少个了&#xff09;然后直接作差就可以&#xff0c;因为…

天猫方糖 篇一:新版天猫放糖改造立体声

时间线&#xff1a; 2018年11月23日晚&#xff0c;通过分析得到新版天猫精灵可能支持立体声。后来经过不懈努力下&#xff0c;终于找到接线方式并且当晚测试成功&#xff0c;这将是是民间第一个支持立体声输出的天猫方糖。 2018年11月24日下午&#xff0c;在众群友的指导下&am…

【LeetCode-6223 hard】317场周赛. 移除子树后的二叉树高度

力扣 题干&#xff1a; 解题报告&#xff1a; 我做麻烦了 &#xff0c;其实两遍dfs就可以了&#xff0c;第一遍算高度&#xff0c;第二遍算深度&#xff0c;并且在第二次dfs的时候可以直接维护出答案数组&#xff1a;ans[i]代表删掉i为根节点的子树后树的高度。 其实主要的思…

LINQ TO SQL (一):1. 对象关系设计器(O/R 设计器)

对象关系设计器&#xff08;O/R 设计器&#xff09;的作用&#xff1a; 1. 提供了一个可视化设计图面&#xff0c;用于创建基于数据库中对象的 LINQ to SQL 实体类和关系&#xff1b;创建映射到数据库中的对象的对象模型。 2. 生成一个强类型 DataContext&#xff0c;用于在实体…

【LeetCode - 1235. hard】规划兼职工作

题干&#xff1a; 先来看简单版本&#xff1a; n个区间&#xff0c;求最大的不相交区间数 【51NOD—贪心算法专题】 D 做任务一 区间贪心最大不相交子区间数_荷叶田田_的博客-CSDN博客 如果限定这道题的报酬都是1&#xff0c;那么就转化成【最大不相交区间数】了。 那道题…

HTML 链接 强制打开“另存为...”弹出式文本链接打开HTML

现在的HTML5里有一个download属性&#xff0c;可以直接进行另存为&#xff0c;还可以自己重新命名文件。。。 <a href"file link" download"filename.ext" target"_blank">Click here to download</a> HTML <a> download 属性…