PS:如果读过题了可以跳过题目描述直接到题解部分

提交链接:洛谷 P8552 Rabbit

题目

题目背景

“说实话,最喜欢你了;因为长得好看,所以最喜欢你了。

你的性格,我最喜欢了;虽然不太清楚,但是最喜欢了。”

赫尔德最近加入了一个奇怪的社区,那里面流行一种“配对追星”的活动。大家在人群中找到那个最耀眼的人,就作为自己的偶像了。

题目描述

赫尔德不知道这样是否好,为了研究这个活动,她想先从这个活动能持续多久开始研究。于是她抽象了这个问题。

给定一棵树,共 n 个点,分别编号为 1∼n。

每次操作,你需要选出三个点 a,b,c 将他们标记,满足:

  • c 是 a 到 b 简单路径上编号最大的点;
  • a,b,c 两两不同;
  • a,b,c 先前都没有被标记过。

问至多能进行多少次操作。

提示

树上 p 到 q 的简单路径是指一个数列 a[1]​,…,a[k]​,满足:

  1. a[1​]=p,a[k​]=q;
  2. 其中没有重复元素;
  3. 对于所有 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相关推荐

  1. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  2. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  3. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  4. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  5. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  6. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  7. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  8. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  9. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

最新文章

  1. 结构体中定义函数指针
  2. 异步调用可以转化为同步调用吗?
  3. Python中super()和__init__()方法
  4. 服务器备份文件格式,证书服务器,备份,还原
  5. mysql列增减_Mysql基本操作——增减改查
  6. lunixs 常用命令c语言,常用Lunix命令 - osc_271igh42的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. MySQL笔记-SQL语句中可以使用单引号包裹任意类型
  8. Java 时间和字符换的处理
  9. 内存笔记之DIMM与DDR
  10. C语言程序设计笔记(浙大翁恺版) 第二周:计算
  11. CIFAR10数据集集 cifar-10-python.tar.gz
  12. 海康机器人工业相机sdk简介
  13. python英文文本分析和提取_英文文本挖掘预处理流程总结
  14. forgot [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列13
  15. 军智与民智中几个问题的探讨
  16. ossec开源入侵检测系统安装配置
  17. 动态大奖赛和CRM解决方案时间表说明
  18. CSS打造图片翻转立体3D效果
  19. java replace会替换吗,java replace replaceAll 替换字符串的用法和区别实例
  20. 【软硬件测试】测试经验:软硬件结合测试要点

热门文章

  1. 中国一次性卫生用品生产设备行业深度调研报告(2022版)
  2. 综合练习题【C++】
  3. 文字怎样转语音播音?这三个软件值得收藏
  4. C++实现CRC冗余校验中FCS检测序列的生成
  5. Python-UnixTimeStamp
  6. 如何确定latex可以调用的字体名称
  7. android:scaletype没作用,ImageView的属性android:scaleType的作用分析
  8. Binder原理学习记录
  9. VS2010安装包制作全过程图解
  10. 织梦5.7系统dede:likearticle标签使用教程|