Codeforces 799B 暴力 set

博客介绍了如何解决Codeforces上的一个题目,该题目涉及处理T恤的颜色和价格,以及根据顾客的偏好找到最便宜的T恤。由于每种颜色只有3种,博主建议使用set来优化搜索,通过维护3个set分别对应3种颜色,每次从set中取出最便宜的价格,从而避免了暴力搜索导致的时间超限问题。

传送门:题目

题意:

n件T恤,告诉你每件T恤的价格,每件T恤的价格都不相同,和T恤正反面的颜色,颜色有且只有3种
然后有m个顾客,每个顾客都有自己的基于颜色偏好值,有且只有1种,他们会购买自己喜欢的颜色且价格最便宜的。
依次输出第i名顾客购买T恤的价格。如果没有自己喜欢的颜色,输出-1

题解:

第一开始我没看到颜色有且只有三种,直接上了一个结构体,记录颜色和价格,然后直接 n2

<think>嗯,我现在要解决的问题是Codeforces上的题目,编号191C。题目链接是https://codeforces.com/problemset/problem/191/C。用户让我翻译一下题面,所以我得先仔细阅读原题,理解每个部分的意思,然后用中文准确表达出来。 首先,题目名称是“Fools and Roads”,直译的话就是“愚人与道路”。可能这里的“愚人”是题目中的某个设定,或者有特定的含义,但翻译时可能需要保留原名或者意译。不过通常题目名称可能不需要完全直译,根据内容可能更合适。不过暂时先看题目内容。 题目描述部分:我记得Codeforces的题目描述有时候会比较简洁,但关键信息要抓住。比如题目给出的是一个关于树的问题,树有n个节点,然后有k次操作,每次操作在两个节点之间的路径上的边都加一,最后要输出每条边被加了多少次。 首先,题目的大意是:给定一棵树,节点数为n,然后有k次旅行,每次旅行从u到v,路径上的所有边的计数器都加一。最后询问每条边的计数器的值。需要将这个过程用中文描述清楚。 可能需要注意的术语,比如“tree”翻译成“树”,“nodes”翻译成“节点”,“path”翻译成“路径”,“queries”翻译成“询问”或者“查询”。但这里的操作可能是指k次旅行,所以可能需要用更符合场景的词,比如“操作次数”或者“k次行程”。 接下来输入部分:输入第一行是n,然后是n-1行,每行两个数,表示树的边。然后是k,接着k行每行两个数u和v,表示一次行程的起点和终点。输出是n-1个数,按输入边的顺序输出每条边被经过的次数。 举个例子,比如输入样例: 3 1 2 2 3 2 1 3 3 1 输出应该是2 2,因为两条边(1-2和2-3)在两次行程中各被经过两次,所以各自的总次数是2。 翻译的时候需要确保输入输出格式描述清楚,特别是边的顺序是按照输入的边顺序输出结果。比如,每条边在输入时的顺序,输出时对应的次数要按那个顺序排列。 可能需要注意的地方是,树的边是无向的,但在处理路径的时候,路径是唯一的,因为是树结构,所以u到v的路径是唯一的。在每次操作中,路径上的所有边都会被加一。所以问题转化为,如何高效地处理多个路径上的边权更新,最后统计每条边的总次数。 那么翻译题面的步骤大概是: 1. 题目名称:可能需要保留原意,或者根据内容调整。比如“愚人和道路”或者“路上的愚人”? 2. 问题描述:给定一棵有n个节点的树,树边按输入顺序排列。然后有k次行程,每次行程从u到v,路径上的每条边的计数器增加1。最后需要按输入边的顺序输出每条边的计数器值。 3. 输入格式:第一行n,接着n-1行每行两个数表示边。然后是k,接着k行每行两个数u和v。 4. 输出格式:一行,包含n-1个整数,对应每条边的计数器值,按输入顺序。 可能需要检查是否题面中有其他条件,比如数据范围。原题的数据范围可能很大,比如n到1e5级别,这时候需要高效的算法,比如树上差分。但翻译题面的时候不需要涉及解法,只是翻译题面本身。 例如,原题可能的数据范围: n的范围是1到1e5,k到1e5,这样暴力处理每个路径会超时。所以必须用O(k + n)的算法,比如利用LCA和差分数组。 但题面翻译的时候不需要考虑解法,只要准确传达题意即可。 现在,把题目内容用中文准确表达出来: 题目名称:愚人与道路 问题描述: 给定一棵包含n个节点的树,节点编号为1到n。树上的边是无向的。最初,所有边上的计数器均为0。 接下来有k次行程。每次行程由两个节点u和v描述,表示从u出发到v的路径。对于每次行程,路径上所有边的计数器都会增加1。注意,路径是唯一的,因为这是一棵树。 你的任务是,在处理完所有k次行程后,按照输入给出的边的顺序,输出每条边的计数器的最终值。 输入格式: 第一行包含一个整数n(1 ≤ n ≤ 1e5),表示树的节点数。 接下来的n-1行,每行包含两个整数a和b(1 ≤ a, b ≤ n),表示树中的一条边。这些边的顺序将决定输出的顺序。 然后一行包含一个整数k(0 ≤ k ≤ 1e5),表示行程的次数。 接下来的k行,每行包含两个整数u和v(1 ≤ u, v ≤ n),表示一次行程的起点和终点。 输出格式: 输出一行,包含n-1个整数,按照输入边的顺序,依次输出每条边的计数器的值。 示例: 输入: 3 1 2 2 3 2 1 3 3 1 输出: 2 2 解释:两次行程的路径都是1-2-3,因此边1-2和2-3各被增加两次,所以结果是2和2。 在翻译的时候,需要注意术语的准确性,比如“行程”是否更合适的词,或者“操作”。例如,原题中的“trips”可能翻译为“行程”或者“旅行”更合适。例如,“每次行程”对应每个u到v的路径。 另外,数据范围的翻译可能需要包括,比如n和k的取值范围是否较大,这样读者可以知道需要高效算法。但原题中的输入条件可能包括这些,所以翻译时也要如实反映。 例如,原题的数据范围可能给出: Constraints: 1 ≤ n ≤ 1e5 0 ≤ k ≤ 1e5 这样在翻译时需要包含这些条件。 总结,我需要将题面准确翻译成中文,包括问题描述、输入输出格式、示例,以及数据范围等。同时保持术语的准确性,让读者能够理解题目要求。</think>### 题目翻译 **题目名称**:愚人与道路 **题目链接**:https://codeforces.com/problemset/problem/191/C --- #### 问题描述 给定一棵包含 `n` 个节点的树(节点编号为 `1` 至 `n`),树上的边是无向的。初始时,所有边的计数器均为 `0`。 接下来有 `k` 次行程。每次行程由两个节点 `u` 和 `v` 描述,表示从 `u` 出发到 `v` 的唯一路径。对于每次行程,路径上所有边的计数器都会增加 `1`。 你的任务是:处理完所有 `k` 次行程后,按照输入给出的边的顺序,输出每条边的计数器的最终值。 --- #### 输入格式 - 第一行:整数 `n`(`1 ≤ n ≤ 1e5`),表示树的节点数。 - 接下来的 `n-1` 行:每行两个整数 `a` 和 `b`(`1 ≤ a, b ≤ n`),表示树的边。这些边的顺序决定了输出的顺序。 - 随后一行:整数 `k`(`0 ≤ k ≤ 1e5`),表示行程次数。 - 接下来的 `k` 行:每行两个整数 `u` 和 `v`(`1 ≤ u, v ≤ n`),表示一次行程的起点和终点。 --- #### 输出格式 输出一行,包含 `n-1` 个整数,按输入边的顺序依次输出每条边的计数器值。 --- #### 示例 **输入**: ``` 3 1 2 2 3 2 1 3 3 1 ``` **输出**: ``` 2 2 ``` **解释**: 两次行程的路径均为 `1 → 2 → 3`,因此边 `1-2` 和 `2-3` 各被增加 `2` 次。 --- #### 数据范围 - `1 ≤ n, k ≤ 1e5` - 输入保证是一棵树。 --- ### 题目解法思路 本题需高效处理树上路径的区间更新(每条边的计数器增加),最终单点查询。直接暴力遍历路径会超时,需使用**树上差分**结合 **LCA(最近公共祖先)** 算法,时间复杂度为 `O(n + k log n)`。具体步骤: 1. 预处理树的父节点和深度信息,用于快速计算 LCA。 2. 对每次行程 `u → v`,找到其 LCA,并在差分数组上标记路径。 3. 最后通过一次 DFS 或 BFS 累加差分值,得到每条边的最终计数。 (注:此部分为解题思路,题目仅要求翻译题面,故可省略。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值