链接:https://ac.nowcoder.com/acm/contest/59439/B 来源:牛客网 除了关小竹的房间还有 � m个房间,小竹的房间有 � n个可以逃离的出口,每个出口连接着 � m个房间中的某一个。当一个出口连接的房间有劫匪时,该出口便不能逃离。 现在,妈妈想请你编写一个程序,求出有且仅有一位劫匪在 � x 号房间时, � n个出口中有多少个出口可以逃离。 由于劫匪身处的房间不是固定的,妈妈会进行 � q 次询问。 输入描述: 第一行三个整数 � , � , � ( 1 ≤ � , � , � ≤ 1 0 5 ) n,m,q(1≤n,m,q≤10 5 )。 第二行 � n 个用空格隔开的整数,第 � i 个整数为 � � ( 1 ≤ � � ≤ � ) a i (1≤a i ≤m),表示编号为 � i 的出口,连接着 � � a i 号房间。 接下来 � q 行,每行 一个用空格隔开的整数 � ( 1 ≤ � ≤ � ) x(1≤x≤m)。 输出描述: � q 行, 每行一个整数,表示有多少个出口可以逃离。
时间: 2024-02-29 08:55:27 浏览: 12
这道题可以用并查集来做。先把所有房间都看成一个独立的集合,然后遍历每个出口,将它所连接的房间合并到一个集合中。最后对于每个询问,找到被劫匪占据的房间所在的集合,并统计该集合中能够逃离的出口数量即可。具体实现可以参考下面的代码:
```python
n, m, q = map(int, input().split())
fa = [i for i in range(m+1)] # 并查集初始化
def find(x):
if fa[x] != x:
fa[x] = find(fa[x])
return fa[x]
for i, a in enumerate(map(int, input().split()), 1):
fa[find(a)] = find(i)
for _ in range(q):
x = int(input())
cnt = 0
for i in range(1, n+1):
if find(i) == find(x):
cnt += 1
print(cnt)
```
时间复杂度为 $O((n+q)\alpha(m))$,其中 $\alpha(m)$ 是 Ackermann 函数的反函数,可以视为常数级别。
相关问题
链接:https://ac.nowcoder.com/acm/contest/68233/B 来源:牛客网 输入三个整数,求以下三数的和, 1+2+...+a + 12+22+...+b2 + 1/1+1/2+...+1/c
这是一道数学题,需要求解三个数的和。分别是等差数列的和、平方数列的和和调和级数的和。具体做法如下:
1. 等差数列的和可以使用等差数列求和公式求解,即Sn = n(a1+an)/2,其中a1=1,an=a,n为等差数列的项数。
2. 平方数列的和可以使用平方和公式求解,即Sn = n(n+1)(2n+1)/6,其中n为平方数列的项数,即b。
3. 调和级数的和可以使用调和级数公式求解,即Sn = 1+1/2+1/3+...+1/c,其中c为调和级数的项数。
具体代码实现如下:
```
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, x;
cin >> n >> x;
double a = n * pow(n, M_PI);
cout << fixed << setprecision(x) << a << endl;
}
return 0;
}
```
链接:https://ac.nowcoder.com/acm/contest/68233/B 来源:牛客网 输入三个整数,求以下三数的和, 1+2+...+a + 12+22+...+b2 + 1/1+1/2+...+1/c
这道题目需要求解的是一个数学问题,需要对题目进行分析。首先,我们可以将题目中的三个数列分别求和,得到1到a的和、12到b的平方和以及1到1/c的倒数和。接下来,我们需要根据引用[3]中的思路,从中任取两场比赛,对满足和各出现一次的做统计,结果数即为(a-1)*(b-1)*(c-1)。最终答案就是三个数列的和乘以结果数。具体的计算过程可以参考下面的公式:
sum = (a*(a+1))/2 + (b*(b+1)*(2*b+1))/6 + (1/((double)c)*(1+(1/((double)c-1)))) * (a-1)*(b-1)*(c-1);
其中,(a*(a+1))/2表示1到a的和,(b*(b+1)*(2*b+1))/6表示12到b的平方和,(1/((double)c)*(1+(1/((double)c-1))))表示1到1/c的倒数和,(a-1)*(b-1)*(c-1)表示结果数。