洛谷 P8552 Rabbit
PS:如果读过题了可以跳过题目描述直接到题解部分
提交链接:洛谷 P8552 Rabbit
题目
题目背景
“说实话,最喜欢你了;因为长得好看,所以最喜欢你了。
你的性格,我最喜欢了;虽然不太清楚,但是最喜欢了。”
赫尔德最近加入了一个奇怪的社区,那里面流行一种“配对追星”的活动。大家在人群中找到那个最耀眼的人,就作为自己的偶像了。
题目描述
赫尔德不知道这样是否好,为了研究这个活动,她想先从这个活动能持续多久开始研究。于是她抽象了这个问题。
给定一棵树,共 n 个点,分别编号为 1∼n。
每次操作,你需要选出三个点 a,b,c 将他们标记,满足:
- c 是 a 到 b 简单路径上编号最大的点;
- a,b,c 两两不同;
- a,b,c 先前都没有被标记过。
问至多能进行多少次操作。
提示
树上 p 到 q 的简单路径是指一个数列 a[1],…,a[k],满足:
- a[1]=p,a[k]=q;
- 其中没有重复元素;
- 对于所有 1≤i<k,a[i+1] 与 a[i] 有边相连。
输入格式
本题有多组数据。
第一行是数据组数 T,接下来 T 组数据,每组数据格式如下:
第一行一个正整数 n。
接下来 n−1 行,每行两个正整数 x,y,描述树上的一条连接 x,y 的边。
输出格式
对于每组数据输出一行一个非负整数,为答案。
样例
输入
3 3 2 3 1 3 4 2 3 3 4 4 1 7 2 5 5 1 2 6 2 3 7 4 3 7
输出
1 1 2
说明/提示
样例解释
对于第一组数据,可以选择 a=1,b=2,c=3。
对于第三组数据,可以依次选择 a=3,b=4,c=7,a=1,b=2,c=5。
数据范围
设 S 为每个测试点所有数据中 n 的和。
对于所有数据:1≤T≤3×10^4,1≤n≤2×10^5,S≤6×10^5。
子任务编号 | n≤ | S≤ | 特殊性质 | 子任务依赖 | 分数 |
---|---|---|---|---|---|
1 | 5 | 3 | |||
2 | 20 | 60 | 5 | ||
3 | B | 12 | |||
4 |
333 | 10^3 | A | 9 | |
5 | 333 | 10^3 | 2,4 | 7 | |
6 | 3333 | 10^4 | A | 4 | 15 |
7 | 3333 | 10^4 | 5,6 | 13 | |
8 | A | 6 | 12 | ||
9 | 1,3,7,8 | 24 |
特殊限制 A:保证树的形态是一条链,即树上不存在度数大于 2 的点。
特殊限制 B:保证树随机生成:对于每个整数 i∈[2,n],均匀随机选择整数 j∈[1,i−1] 并在 i,j 间连边,然后随机打乱点的编号。
题解
我们在输入的时候用邻接表,我用的是动态数组(主要是为了节约内存),来储存边,存边的时候要注意是在编号较大的节点里存较小节点。
然后我们遍历的时候把编号从小到大加入图中,当它的临边已经有节点在图里的时候,就可以把边连起来,并用并查集保存这个子树中的节点个数。为了节约时间,我选择一边找父亲,一边更新,这样可以让他尽可能的形成一个菊花图。
当一个节点加入图中并同时连接了至少两条边的时候,就说明一定会出现一个题中可做标记的情况,又因为标记过的点就不能再用,所以节点个数减3,答案加1。
我还是解释一下为什么一定会出现这种情况。其实原因很简单,就是加入图中的节点编号一定都小于当前节点编号,而未加入图中的节点编号一定大于当前节点编号,那么只要当前节点连了两条节点个数非零的边(节点个数为零可能是之前标记完了),就一定可以被标记,而且当编号更大的节点加入的时候,经过它的一定会标记编号更大的节点,所以当前节点也不会对后面的节点的标记产生影响。
一直遍历到最后一个编号,输出答案即可。
代码实现
//洛谷 P8552 Rabbit
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int t;
int n;
int x,y;
int ans;
int fa[200010];
int res[200010];
vector<int>a[200010];int find(int x){if(x==fa[x]){return x;}return fa[x]=find(fa[x]);
}int main(){scanf("%d",&t);while(t--){scanf("%d",&n);ans=0;for(int i=1;i<=n;++i){a[i].clear();}for(int i=1;i<n;++i){scanf("%d%d",&x,&y);if(x>y){a[x].push_back(y);}else{a[y].push_back(x);}fa[i]=i;res[i]=1;}res[n]=1;for(int i=1;i<=n;++i){int c=0;for(auto j:a[i]){int f=find(j);c+=(!!res[f]);res[i]+=res[f];fa[f]=i;}if(c>=2){res[i]-=3;++ans;}}printf("%d\n",ans);}return 0;
}
解释一下代码里面一个在Dev-C++ 5.11里无法编译的东西(反正我没编译起,很无奈啊)
就是这个
for(auto j:a[i])
它的作用是依次访问整个动态数组的元素,也可以用下面这段代码代替
for(int j=0;j<a.size();++j)
虽然我代码里面写的那个没能编译,但在洛谷上是过了的。
洛谷 P8552 Rabbit相关推荐
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 洛谷 P1387 最大正方形
P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...
- 洛谷P2763 试题库问题
题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...
- 动态规划——洛谷_P1057传球游戏
题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...
- 洛谷P1417 烹调方案
洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...
- 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )
昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...
- 洛谷 - 试炼场(全部题目备份)
整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...
- 洛谷专题训练 ——【算法1-1】模拟与高精度
洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...
最新文章
- 结构体中定义函数指针
- 异步调用可以转化为同步调用吗?
- Python中super()和__init__()方法
- 服务器备份文件格式,证书服务器,备份,还原
- mysql列增减_Mysql基本操作——增减改查
- lunixs 常用命令c语言,常用Lunix命令 - osc_271igh42的个人空间 - OSCHINA - 中文开源技术交流社区...
- MySQL笔记-SQL语句中可以使用单引号包裹任意类型
- Java 时间和字符换的处理
- 内存笔记之DIMM与DDR
- C语言程序设计笔记(浙大翁恺版) 第二周:计算
- CIFAR10数据集集 cifar-10-python.tar.gz
- 海康机器人工业相机sdk简介
- python英文文本分析和提取_英文文本挖掘预处理流程总结
- forgot [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列13
- 军智与民智中几个问题的探讨
- ossec开源入侵检测系统安装配置
- 动态大奖赛和CRM解决方案时间表说明
- CSS打造图片翻转立体3D效果
- java replace会替换吗,java replace replaceAll 替换字符串的用法和区别实例
- 【软硬件测试】测试经验:软硬件结合测试要点