【HDU - 6203】ping ping ping(lca+贪心思想,对lca排序,树状数组差分)

题干:

给出一个n+1个点的树,以及p个点对,需要断开一些点,使得这p个点对路径不连通。输出应该断开的最少点数。

解题报告:

从那p个点对入手的话:首先考虑只有一对点的话,肯定是这条路径上的随便一个点都可以。两个点对呢?肯定是有交点就选交点,没交点就只能破坏两个点了。多个点对呢?比较难考虑了。也比较难想到正解:贪心思维,破坏两个点的LCA是最佳的。

从破坏的点入手:破坏一个点,可以影响到的是所有经过他的所有的路径,转化到有根树中,不难想到这个点就是lca。

当然这个题到这里还不够,还需要加点贪心的思想,对p个点对按照他们的lca深度从大到小排序,如果某个点需要被破坏,那么它的所有子节点(子树)都可以不再需要破坏别的点了(因为它的子节点到别的子节点肯定是要经过该点的,要注意这个前提是lca是排好序的。所以对应的操作就是对子树的所有节点都+1。

为什么要排序呢?因为这样就能保证,当前处理到第i对点u,v,如果这个点所在任意子树的某祖先x如果有被标记过,那么这条路径一定就不用管了,因为uv的lca一定深度小于x,也就是说你u想到达v,一定要经过x,又因为x已经被破坏了,所以这对点直接不用管了,真神奇的想法!!

所以接下来问题就是判断现在在(u,v)之间的路径上有没有被破坏的点(也就是查询u和v这两点的值是不是>0的),如果没有的话那么此时就要破坏这个lca点,如果有的话就直接continue。

所以dfs序来维护子树,然后用树状数组差分来维护区间和,查询的时候查询单点值。(当然,这后一步可以直接用线段树来取代)

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e4 + 5;
int n,in[MAX],out[MAX],clk,dep[MAX],id[MAX],c[MAX*10];
int fa[MAX][33];
vector<int> vv[MAX];
struct Node {int a,b,lca;bool operator <(const Node & bb)const {return dep[lca] > dep[bb.lca];}
} p[MAX*5];
int lowbit(int x){ return x&(-x); }
int query(int pos) {int res = 0;while(pos > 0) {res += c[pos];pos -= lowbit(pos);}return res;
}
void update(int pos,int val) {while(pos < MAX) {c[pos] += val;pos += lowbit(pos);}
}
void dfs(int cur,int rt,int deep) {in[cur] = ++clk;dep[cur] = deep;fa[cur][0]=rt;id[clk] = cur;int up = vv[cur].size();for(int i = 1; i<=31; i++) {fa[cur][i] = fa[fa[cur][i-1]][i-1];}for(int i = 0; i<up; i++) {int v = vv[cur][i];if(v == rt) continue;dfs(v,cur,deep+1);}out[cur] = clk; 
}
int lca(int u,int v) {if(dep[v] > dep[u]) swap(u,v);for(int i = 31; i>=0; i--) {if(dep[fa[u][i]] >= dep[v]) u = fa[u][i];}if(u == v) return u;for(int i = 31; i>=0; i--) {if(fa[u][i] != fa[v][i]) u = fa[u][i],v=fa[v][i];}return fa[u][0];
}
int main()
{while(~scanf("%d",&n)) {int a,b;clk=0;memset(fa,0,sizeof fa);memset(c,0,sizeof c);for(int i = 0; i<=n+1; i++) vv[i].clear();for(int i = 1; i<=n; i++) {scanf("%d%d",&a,&b);a++,b++;vv[a].pb(b);vv[b].pb(a);}dfs(1,0,1);int q;scanf("%d",&q);for(int i = 1; i<=q; i++) {scanf("%d%d",&a,&b);a++,b++;p[i].a = a,p[i].b = b,p[i].lca = lca(a,b);}sort(p+1,p+q+1);int ans = 0;for(int i = 1; i<=q; i++) {if(query(in[p[i].a]) + query(in[p[i].b]) == 0) {ans++;update(in[p[i].lca],1);update(out[p[i].lca]+1,-1);}}printf("%d\n",ans);}return 0 ;
}

 

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

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

相关文章

机器学习笔记(六):正则化

目录 1&#xff09;The problem of overfitting 2&#xff09;Cost function 3&#xff09;Regularized linear regression 4&#xff09;Regularized logistic regression 我们已经学习了线性回归和逻辑回归算法&#xff0c;已经可以有效解决很多问题&#xff0c;但是在实…

Hbase单节点安装

zookeeper单节点部署 实验环境 操作系统&#xff1a;Ubuntu 16.04 Hadoop&#xff1a;Hadoop 2.7.5 Zookeeper&#xff1a;zookeeper 3.4.12 Java&#xff1a;java version 1.8.0 到/install-package目录下查看hbase安装包 #>ls /install-package本文中用的是hbase-1…

ROS 常用命令字典

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请标明出处: http://www.cnblogs.com/liu-fa/p/5761448.html 该博文适合已经具备一定的ROS编程基础的人&#xff0c;快速查看ROS相关指令。 本文持续更新中&#xff0c;望关注收藏&#xff0c;一起改进... 创建 ROS 工作…

【HDU - 3966】Aragorn's Story(树链剖分,模板题)

题干&#xff1a; Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who want to invade his kingdom. As Aragorn knows, the enemy has N camps out of his kingdom and M edges connect t…

机器学习笔记(七):神经网络:表示

目录 1&#xff09;Non-linear hypotheses 2&#xff09;Model representation 1 3&#xff09;Model representation 2 4&#xff09;Examples and intuitions 1 5&#xff09;Examples and intuitions 2 6&#xff09;Multi-class classification 1&#xff09;Non-lin…

ROS入门_1.10 理解ROS服务和参数

目录 ROS Services使用rosservice rosservice listrosservice typerosservice call Using rosparam rosparam listrosparam set and rosparam getrosparam dump and rosparam load 本教程假设从前一教程启动的turtlesim_node仍在运行&#xff0c;现在我们来看看turtlesim提供了…

1.Introduction and Evaluation

感谢七月在线罗老师和吴同学&#xff01; 最近报了七月在线的《推荐系统实战》班&#xff0c;根据上课资料和思维导图整理了这篇笔记&#xff01; 1&#xff09;推荐系统介绍 思维导图如下&#xff0c;其中需要掌握的是推荐系统存在的前提&#xff1a;信息过载和用户需求不明…

【ZOJ - 2968 】Difference Game (贪心,思维模拟)

题干&#xff1a; Now you are going to play an interesting game. In this game, you are given two groups of distinct integers and C coins. The two groups, named Ga and Gbrespectively, are not empty and contain the same number of integers at first. Each time…

使用 rqt_console 和 roslaunch

Description:本教程介绍如何使用 rqt_console 和 rqt_logger_level 进行调试&#xff0c;以及如何使用 roslaunch 同时运行多个节点。早期版本中的 rqt 工具并不完善&#xff0c;因此&#xff0c;如果你使用的是“ROS fuerte”或更早期的版本&#xff0c;请同时参考 这个页面 学…

机器学习必备宝典-《统计学习方法》的python代码实现、电子书及课件

本文转自微信公众号&#xff1a;机器学习初学者 原创&#xff1a; 机器学习初学者 机器学习初学者 6天前 《统计学习方法》可以说是机器学习的入门宝典&#xff0c;许多机器学习培训班、互联网企业的面试、笔试题目&#xff0c;很多都参考这本书。本站根据网上资料用python复现…

【2019牛客暑期多校训练营(第一场) - H】XOR(线性基,期望的线性性)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/881/H 来源&#xff1a;牛客网 Bobo has a set A of n integers a1,a2,…,ana1,a2,…,an. He wants to know the sum of sizes for all subsets of A whose xor sum is zero modulo (1097)(1097). F…

机器学习入门必备的13张“小抄”(附下载)

目录 1&#xff09;TensorFlow 2&#xff09;Keras 3&#xff09;Neural Networks 4&#xff09;Numpy 5&#xff09;Scipy 6&#xff09;Pandas 7&#xff09;Scikit-learn 8&#xff09;Matplotlib 9&#xff09;PythonForDataScience 最近在github上发现了很有用的…

ROS launch文档介绍

本文章转自&#xff1a;https://charlyhuangrostutorial.wordpress.com/2015/08/12/20/ 前面已经提过关于launch 档的角色&#xff0c;很类似bash 档&#xff0c;基本上就是把所有为了执行某个特定功能所需要的指令都写在一张纸上&#xff0c;交给ROS 一次执行开来。举例来说&a…

【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/881/A 来源&#xff1a;牛客网 Two arrays u and v each with m distinct elements are called equivalent if and only if RMQ(u,l,r)RMQ(v,l,r) for all 1≤l≤r≤m where RMQ(w,l,r) denotes th…

吴恩达机器学习作业(1):线性回归

目录 1&#xff09;导入相关库和数据 2&#xff09;代价函数 3&#xff09;批量梯度下降 4&#xff09;绘制线性模型 前阵子在网易云课堂学习了吴恩达老师的机器学习课程&#xff0c;今天结合网上资料&#xff0c;用Python实现了线性回归作业&#xff0c;共勉。建议大家使…

【HDU - 5886】Tower Defence(树的直径,思维,dp)

题干&#xff1a; There was a civil war between two factions in Skyrim, a province of the Empire on the continent of Tamriel. The Stormcloaks, led by Ulfric Stormcloak, are made up of Skyrims native Nord race. Their goal is an independent Skyrim free from …

(1).数据结构概述

目录 数据结构概述 预备知识&#xff1a; 模块&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得&#xff1a; 数据结构概述 定义&#xff1a;如何把现实中大量复杂的问题以特定的数据类型和特定的存储结构保存到主存储器中(内存)中&#xff0c; 以及在此基础上为实…

ROS导航之参数配置和自适应蒙特卡罗定位

我们的机器人使用两种导航算法在地图中移动&#xff1a;全局导航&#xff08;global&#xff09;和局部导航&#xff08;local)。这些导航算法通过代价地图来处理地图中的各种信息&#xff0c;导航stack使用两种costmaps http://www.cnblogs.com/zjiaxing/p/5543386.html存储环…

吴恩达机器学习作业(2):多元线性回归

目录 1&#xff09;数据处理 2&#xff09;代价函数 3&#xff09;Scikit-learn训练数据集 4&#xff09;正规方程 练习1还包括一个房屋价格数据集&#xff0c;其中有2个变量&#xff08;房子的大小&#xff0c;卧室的数量&#xff09;和目标&#xff08;房子的价格&#…

【洛谷 - P2756】飞行员配对方案问题(网络流最大流,输出方案)

题干&#xff1a; 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员&#xff0c;其中1 名是英国飞行员&#xff0c;另1名是外籍飞行员。在众多的飞行员中…