Atcoder Beginner Contest 309——D-F讲解

前言

由于最近期末考试,所以之前几场都没打,给大家带了不便,非常抱歉。

这个暑假,我将会持续更新,并给大家带了更好理解的题解!希望大家多多支持。

由于, A ∼ C A\sim C AC 题比较简单,所以就不写了,如果大家有不会的,可以私信问我。


D - Add One Edge

1. Description

Problem Statement

We have an undirected graph with ( N 1 + N 2 ) (N_1+N_2) (N1+N2) vertices and M M M edges. For i = 1 , 2 , … , M i=1,2,\ldots,M i=1,2,,M, the i i i-th edge connects vertex a i a_i ai and vertex b i b_i bi.

The following properties are guaranteed:
Vertex u u u and vertex v v v are connected, for all integers u u u and v v v with 1 ≤ u , v ≤ N 1 1 \leq u,v \leq N_1 1u,vN1.
Vertex u u u and vertex v v v are connected, for all integers u u u and v v v with N 1 + 1 ≤ u , v ≤ N 1 + N 2 N_1+1 \leq u,v \leq N_1+N_2 N1+1u,vN1+N2.
Vertex 1 1 1 and vertex ( N 1 + N 2 ) (N_1+N_2) (N1+N2) are disconnected.
Consider performing the following operation exactly once:
choose an integer u u u with 1 ≤ u ≤ N 1 1 \leq u \leq N_1 1uN1 and an integer v v v with N 1 + 1 ≤ v ≤ N 1 + N 2 N_1+1 \leq v \leq N_1+N_2 N1+1vN1+N2, and add an edge connecting vertex u u u and vertex v v v.
We can show that vertex 1 1 1 and vertex ( N 1 + N 2 ) (N_1+N_2) (N1+N2) are always connected in the resulting graph; so let d d d be the minimum length (number of edges) of a path between vertex 1 1 1 and vertex ( N 1 + N 2 ) (N_1+N_2) (N1+N2).
Find the maximum possible d d d resulting from adding an appropriate edge to add.

Definition of "connected" Two vertices $u$ and $v$ of an undirected graph are said to be connected if and only if there is a path between vertex $u$ and vertex $v$. ### Constraints

1 ≤ N 1 , N 2 ≤ 1.5 × 1 0 5 1 \leq N_1,N_2 \leq 1.5 \times 10^5 1N1,N21.5×105
0 ≤ M ≤ 3 × 1 0 5 0 \leq M \leq 3 \times 10^5 0M3×105
1 ≤ a i ≤ b i ≤ N 1 + N 2 1 \leq a_i \leq b_i \leq N_1+N_2 1aibiN1+N2
( a i , b i ) ≠ ( a j , b j ) (a_i,b_i) \neq (a_j,b_j) (ai,bi)=(aj,bj) if i ≠ j i \neq j i=j.
Vertex u u u and vertex v v v are connected for all integers u u u and v v v such that 1 ≤ u , v ≤ N 1 1 \leq u,v \leq N_1 1u,vN1.
Vertex u u u and vertex v v v are connected for all integers u u u and v v v such that N 1 + 1 ≤ u , v ≤ N 1 + N 2 N_1+1 \leq u,v \leq N_1+N_2 N1+1u,vN1+N2.
Vertex 1 1 1 and vertex ( N 1 + N 2 ) (N_1+N_2) (N1+N2) are disconnected.
All input values are integers.

Input

The input is given from Standard Input in the following format:

N 1 N_1 N1 N 2 N_2 N2 M M M
a 1 a_1 a1 b 1 b_1 b1
⋮ \vdots
a M a_M aM b M b_M bM

Output

Print the answer.

Sample Input 1

3 4 6
1 2
2 3
4 5
4 6
1 3
6 7

Sample Output 1

5

If we set u = 2 u=2 u=2 and v = 5 v=5 v=5, the operation yields d = 5 d=5 d=5, which is the maximum possible.

Sample Input 2

7 5 20
10 11
4 5
10 12
1 2
1 5
5 6
2 4
3 5
9 10
2 5
1 4
11 12
9 12
8 9
5 7
3 7
3 6
3 4
8 12
9 11

Sample Output 2

4

2. Solution


根据这个图以及题目大意,可以看出题目中所给的无向图一定是分成了两个连通块,并且起点 1 1 1,终点 N 1 + N 2 N_1+N_2 N1+N2一定不再同一个连通块内部

(1)对于连通块 1 1 1,我们只需计算起点 1 1 1 到连通块内各个顶点的最短距离,取出最长的距离 r e s 1 res_1 res1
(2)对于连通块 2 2 2,我们只需计算终点 N 1 + N 2 N_1+N_2 N1+N2 到连通块内各个顶点的最短距离,取出最长的距离 r e s 2 res_2 res2

最后的答案就是 r e s 1 + r e s 2 + 1 res_1+res_2+1 res1+res2+1,因为我们中间还要加一条边,所以距离还会多 1 1 1


3.Code

#include <iostream>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

const int N = 3e5 +10;

int n1, n2, m;
int u, v;
vector<int> g[N];
int dist[N], st[N];

void bfs(int start) //模版(不多说了,不会的可以问我)
{
	memset(dist, 0x3f, sizeof dist);
	memset(st, 0, sizeof st);
	queue<int> q;
	q.push(start);
	dist[start] = 0;
	
	while (q.size())
	{
		auto t = q.front();
		q.pop();
		
		if (st[t]) continue;
		st[t] = 1;
		
		for (auto c : g[t])
			q.push(c), dist[c] = min(dist[c], dist[t] + 1);
	}
}

int main()
{
	cin >> n1 >> n2 >> m;
	
	while (m --)
	{
		cin >> u >> v;
		g[u].push_back(v), g[v].push_back(u);
	}
	
	bfs(1); //求连通块1内点1到其他点的最短距离
	int res1 = 0;
	for (int i = 1; i <= n1; i ++)
		res1 = max(res1, dist[i]);//取出到所有点中最短距离中最长的
		
	bfs(n1 + n2);//求连通块2内点N1+N2到其他点的最短距离
	int res2 = 0;
	for (int i = n1 + 1; i <= n1 + n2; i ++)
		res2 = max(res2, dist[i]); //取出到所有点中最短距离中最长的
		
	cout << res1 + res2 + 1 << endl;
	
	return 0;
}

4. Time Complexity: O ( N 1 + N 2 ) O(N_1+N_2) O(N1+N2)


E - Family and Insurance

1.Description

Problem Statement

There is a family consisting of person 1 1 1, person 2 2 2, … \ldots , and person N N N. For i ≥ 2 i\geq 2 i2, person i i i’s parent is person p i p_i pi.
They bought insurance M M M times. For i = 1 , 2 , … , M i=1,2,\ldots,M i=1,2,,M, person x i x_i xi bought the i i i-th insurance, which covers that person and their descendants in the next y i y_i yi generations.
How many people are covered by at least one insurance?

Constraints

2 ≤ N ≤ 3 × 1 0 5 2 \leq N \leq 3 \times 10^5 2N3×105
1 ≤ M ≤ 3 × 1 0 5 1 \leq M \leq 3 \times 10^5 1M3×105
1 ≤ p i ≤ i − 1 1 \leq p_i \leq i-1 1pii1
1 ≤ x i ≤ N 1 \leq x_i \leq N 1xiN
1 ≤ y i ≤ 3 × 1 0 5 1 \leq y_i \leq 3 \times 10^5 1yi3×105
All input values are integers.

Input

The input is given from Standard Input in the following format:

N N N M M M
p 2 p_2 p2 … \ldots p N p_N pN
x 1 x_1 x1 y 1 y_1 y1
⋮ \vdots
x M x_M xM y M y_M yM

Output

Print the answer.

Sample Input 1

7 3
1 2 1 3 3 3
1 1
1 2
4 3

Sample Output 1

4

The 1 1 1-st insurance covers people 1 1 1, 2 2 2, and 4 4 4, because person 1 1 1’s 1 1 1-st generation descendants are people 2 2 2 and 4 4 4.

The 2 2 2-nd insurance covers people 1 1 1, 2 2 2, 3 3 3, and 4 4 4, because person 1 1 1’s 1 1 1-st generation descendants are people 2 2 2 and 4 4 4, and person 1 1 1’s 2 2 2-nd generation descendant is person 3 3 3.

The 3 3 3-rd insurance covers person 4 4 4, because person 4 4 4 has no 1 1 1-st, 2 2 2-nd, or 3 3 3-rd descendants.
Therefore, four people, people 1 1 1, 2 2 2, 3 3 3, and 4 4 4, are covered by at least one insurance.

Sample Input 2

10 10
1 1 3 1 2 3 3 5 7
2 1
5 1
4 3
6 3
2 1
7 3
9 2
1 2
6 2
8 1

Sample Output 2

10

2.Solution

在这里插入图片描述
这是样例中所对应的树。

这道题可以运用动态规划
f i f_i fi 表示 i i i 号节点的保险还能延续到多少代。

那么转移就非常简单了:
f i = max ⁡ ( f i , f p i − 1 ) f_i = \max (f_i, f_{p_i} - 1) fi=max(fi,fpi1) (注: p i p_i pi 即题目中所说的含义)。

之后,就进行对每一个点判断:
如果 f i ≥ 0 f_i\ge0 fi0,那么 r e s + + res++ res++

最后的答案就是 r e s res res。(不太明白的话,可以看看代码~~~)


3.Code

#include <iostream>
#include <cstring>

using namespace std;

const int N = 3e5 + 10;

int n, m;
int f[N], p[N];

int main()
{
	cin >> n >> m;
	
	p[1] = 1;
	for (int i = 2; i <= n; i ++)
		cin >> p[i];
	
	memset(f, -1, sizeof f);
		
	while (m --)
	{
		int x, y;
		
		cin >> x >> y;
		
		f[x] = max(f[x], y); //进行最初的赋值,表示x节点可以延续y代
	}
	
	for (int i = 1; i <= n; i ++)
		f[i] = max(f[i], f[p[i]] - 1);
		
	int res = 0;
	for (int i = 1; i <= n; i ++)
		if (f[i] >= 0)
			res ++;
			
	cout << res << endl;
}

4.Time Complexity: O ( N ) O(N) O(N)


F - Box in Box

1. Description

Problem Statement

There are N N N boxes. The i i i-th box has a shape of a rectangular cuboid whose height, width, and depth are h i , w i h_i,w_i hi,wi, and d i d_i di, respectively.
Determine if there are two boxes such that one’s height, width, and depth are strictly greater than those of the other after rotating them if necessary.

Constraints

2 ≤ N ≤ 2 × 1 0 5 2 \leq N \leq 2 \times 10^5 2N2×105
1 ≤ h i , w i , d i ≤ 1 0 9 1 \leq h_i,w_i,d_i \leq 10^9 1hi,wi,di109
All input values are integers.

Input

The input is given from Standard Input in the following format:

N N N
h 1 h_1 h1 w 1 w_1 w1 d 1 d_1 d1
⋮ \vdots
h N h_N hN w N w_N wN d N d_N dN

Output

Print Yes if there are two boxes such that one’s height, width, and depth are strictly greater than those of the other after rotating them if necessary; print No otherwise.

Sample Input 1

3
19 8 22
10 24 12
15 25 11

Sample Output 1

Yes

If you rotate the 2 2 2-nd box to swap its height and depth, the 3 3 3-rd box will have greater height, depth, and width.

Sample Input 2

3
19 8 22
10 25 12
15 24 11

Sample Output 2

No

Sample Input 3

2
1 1 2
1 2 2

Sample Output 3

No

2. Solution

都放在视频里拉~~~,不懂得话可以再来问我。

ABC 309 F题

线段树没有学的同学可以点这里!


3. Code

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 2e5 + 10;

int n;
struct Node1
{
	int h, w, d;
	void change() //保证h, w, d升序
	{
		if (h > w) swap(h, w);
		if (w > d) swap(w, d);
		if (h > w) swap(h, w);
	}
	bool operator< (const Node1 &t)const //重载小于号
	{
		if (t.h == h)
			return w > t.w;
		return h < t.h;
	}
}cube[N];
vector<int> discrete;
struct Node2
{
	int l, r;
	int mn;
}seg[8 * N]; //*8的原因是我们后面插入的时候为了离散化的方便,将Wi - 1也做成了节点

int find(int x) //离散化
{
	return lower_bound(discrete.begin(), discrete.end(), x) - discrete.begin() + 1;
}

void pushup(int u)
{
	seg[u].mn = min(seg[u << 1].mn, seg[u << 1 | 1].mn);
}

void build(int u, int l, int r) //建树
{
	if (l == r)
		seg[u] = {l, l, 0x3f3f3f3f};
	else
	{
		seg[u] = {l, r};
		int mid = l + r >> 1;
		build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}

void modify(int u, int x, int d) //单点修改
{
	if (seg[u].l == x && seg[u].r == x)
		seg[u].mn = min(seg[u].mn, d);
	else
	{
		int mid = seg[u].l + seg[u].r >> 1;
		if (x <= mid) modify(u << 1, x, d);
		else modify(u << 1 | 1, x, d);
		pushup(u);
	}
}

int query(int u, int l, int r) //区间查询
{
	if (seg[u].l >= l && seg[u].r <= r)
		return seg[u].mn;
		
	int mid = seg[u].l + seg[u].r >> 1, res = 0x3f3f3f3f;
	if (l <= mid) res = query(u << 1, l, r);
	if (r > mid) res = min(res, query(u << 1 | 1, l, r));
	
	return res;	
}

int main()
{
	cin >> n;
	
	for (int i = 1; i <= n; i ++)
		cin >> cube[i].h >> cube[i].w >> cube[i].d, cube[i].change();
		
	sort(cube + 1, cube + 1 + n);
	
	for (int i = 1; i <= n; i ++) discrete.push_back(cube[i].w), discrete.push_back(cube[i].w - 1);
	sort(discrete.begin(), discrete.end());
	discrete.erase(unique(discrete.begin(), discrete.end()), discrete.end());
	
	build(1, 0, discrete.size());
	
	for (int i = 1; i <= n; i ++)
	{
		int ans = query(1, 0, find(cube[i].w - 1));
		
		if (ans < cube[i].d)
		{
			cout << "Yes" << endl;
			return 0;
		}
		
		modify(1, find(cube[i].w), cube[i].d);
	}
	
	cout << "No" << endl;
}
东望苍苍,西望茫茫,叶落花凋泪满裳

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git 上传Github 超时问题

提交代码到GitHub总是超时&#xff0c;偶尔会直接上传成功。 提供一下解决方案 1.首先找到网络 2. 找到代理 3. 把自动检查设置全部关闭&#xff0c;然后打开手动设置代理&#xff0c;然后输入ip地址和你代理的端口号&#xff0c;保存即可。 4. 最后使用git push origin mast…

java中如何将一个集合list转成以逗号隔开的字符串

事例代码 代码&#xff1a; package com.air.app;import java.util.ArrayList; import java.util.List;public class ListToStringTest {public static void main(String[] args) {//定义list集合List<String> list new ArrayList<>();list.add("1");…

基于低代码平台打造的焙乐道销售支持系统

编者按&#xff1a;低代码平台说了那么多&#xff0c;在实际应用中又是怎样体现的它的种种优势呢&#xff1f;今天小编结合实际案例来说说。 本文是以最大的烘焙原料产商——焙乐道的销售支持系统为例子&#xff0c;进行说明。 客户说明&#xff1a;焙乐道是一家国际性集团公司…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

CentOS Linux上安装JDK11、MySQL8.0、Minio等软件(rpm脚本模式)

本地环境&#xff1a;Windows 10家庭版 16G内存 512G硬盘 软件&#xff1a;VMWare WorkStation 16.0 FinalShell 4.0.1 一、下载必要软件包 下载软件均选择x86架构64位&#xff01;&#xff01;&#xff01;&#xff08;可根据自己的电脑配置选择&#xff09; CentOS Linu…

数字图像处理(三)

目录 实验六、图像分割方法 实验七、图像识别与分类 实验六、图像分割方法 一、实验目的 了解图像分割技术相关基础知识&#xff1b;掌握几种经典边缘检测算子的基本原理、实现步骤理解阈值分割、区域分割等的基本原理、实现步骤。理解分水岭分割方法的基本原理、实现方法。…

ModaHub魔搭社区:Zilliz Cloud快速开始教程(一)

目录 前提条件 创建 Collection 查看 Collection 插入数据 本教程涵盖以下 Zilliz Cloud 集群操作指南: 创建 Collection查看 Collection插入数据向量搜索、向量查询、通过 ID 获取 Entity删除 Entity删除 Collection 前提条件 在本文档中,我们将使用 Milvus 的 SDK。…

mysql单表查询,排序,分组查询,运算符,select,order by,group by

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…

【计算机视觉】YOLOv8的测试以及训练过程(含源代码)

文章目录 一、导读二、部署环境三、预测结果3.1 使用检测模型3.2 使用分割模型3.3 使用分类模型3.4 使用pose检测模型 四、COCO val 数据集4.1 在 COCO128 val 上验证 YOLOv8n4.2 在COCO128上训练YOLOv8n 五、自己训练5.1 训练检测模型5.2 训练分割模型5.3 训练分类模型5.4 训练…

华为OD机试真题 Java 实现【快递投放问题】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 一、题目描述 有N个快递站点用字符串标识&#xff0c;某些站点之间有道路连接。每个站点有一些包裹要运输&#xff0c;每个站点间的包裹不重复&#xff0c;路上有检查站会导致部分货物无…

博客质量分计算——发布 version 5

目录 1. 背景2. 质量分 version 52.1 version 4 存在问题分析2.2 version 5 改进2.3 消融分析2.3.1 正向积极得分消融实验2.3.2 正向累积得分单变量实验2.3.3 非高分文章消融实验 2.4 V4 和 V5 版本质量分分布对比 3. 总结4. 参考 1. 背景 博客质量分顾名思义是用于衡量一篇博…

MyBatis查询数据库(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 经过前⾯的学习咱们 Spring 系列的基本操作已经实现的差不多了&#xff0…

企业为什么要做自动化测试?如何成功实施自动化测试?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 企业为什么需要自…

掌握Python文件操作的绝招:打造数据之径,揭开文件操作的神秘面纱

文章目录 前言文件的基本操作打开文件操作关闭文件操作对文件进行操作1&#xff09;只读文件操作read()readlines()readline()seek() 2&#xff09;只写文件操作3&#xff09;文件追加操作读写、追加读写操作1. r 模式打开文件2. w 模式打开文件3. a 模式打开文件 以二进制的形…

UDP客户端和服务器

UDP客户端&#xff0c;也就是首先主动发送数据的一方&#xff0c;也就是发起服务请求的一方。 UDP服务器&#xff0c;也就是首先等待接收数据&#xff0c;并对接收的数据进行处理&#xff0c;返回计算结果的一方&#xff0c;也就是提供服务的一方。 在下面实验中使用到的函数 …

Linux进度条

Linux进度条 一.基本概念1.回车和换行2.缓冲区2.实现倒计时 二.进度条 一.基本概念 1.回车和换行 回车&#xff1a;指光标移到该行的起始位置&#xff08;\r&#xff09;。 换行&#xff1a;换到下一行&#xff08;\n&#xff09;。 在c语音里\n将回车和换行相结合了。 2.缓冲…

存在CSRF漏洞的CMS练习

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan CMS 链接&#xff1a;https://pan.baidu.com/s/13F…

Windows操作系统安全加固

Windows操作系统安全加固 一、安全加固基本思路1.1、安全基线1.2、系统信息审查 二、Windows安全配置加固2.1、漏洞修复——补丁安装2.2、漏洞修复——端口封禁2.2.1、windows高危端口加固实践——封禁135端口对外开放 2.3、安全配置加固——账号口令 一、安全加固基本思路 1.…

LinuxI2C应用编程——访问EEPROM

文章目录 介绍读芯片手册代码编译运行 阅读博文&#xff1a;LinuxI2C应用编程——I2C-Tools的使用 介绍 EEPROM (Electrically Erasable Programmable read only memory)&#xff0c;指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 读芯片手册 首先按如图…

cmake操作目录

目录 cmake如何使用子目录 demo cmake生成build目录结构 如果指定子目录编译文件名字(binaryDir) 如果指定子目录编译的路径(binaryDir) 子目录相关的作用域 demo 子目录中定义project cmake如何使用子目录 如果项目比较小的话,我们将所有源码文件放到一个目录里面是没…