问题描述
并查集是解决不相交集合并问题的一种数据结构,简称为 dsu(disjoint set union) 。
有n个集合,编号为1~n,第i个集合里有且只有一个数字i。
现在有 m 次操作,每次操作有以下两种情况:
· M a b:将数字a与数字b所在的集合合并。
· Q a b:查询数字a与数字b是否在一个集合中。
输入格式
第一行输入两个正整数n,m。(1≤n,m≤10⁵)
接下来m行,每行输入一组操作。((1≤a,b≤n)
输出格式
对于每组查询操作,若a,b在同一集合,则输出 Yes,否则输出No。
import os
import sys
n, m = map(int,input().split())
pre = list(range(n + 1))
def find(x):
if pre[x] != x:
pre[x] = find(pre[x])
return pre[x]
def join(a,b):
father_a = find(a)
father_b = find(b)
if father_a != father_b:
pre[father_b] = father_a
for i in range(m):
identify, a, b = map(str,input().split())
a = int(a)
b = int(b)
if identify == 'M':
join(a,b)
else:
if find(a) == find(b):
print('Yes')
else:
print('No')
问题描述
贾母的寿辰即将到来,荣国府为了迎接这个重要的日子,决定将花园布置成贾母最喜欢的样子。
花园中一共摆放了 N 块具有特殊属性的玉石,最开始所有玉石的属性值均为0。贾母会根据自己的喜好进行调整,共会进行Q 次操作,每次操作为以下两种之一:
1.1×y:将前x块玉石的属性值增加y。
2.2×y::将后x块玉石的属性值减少y。
玉石的亮度值由其属性值的绝对值决定。请问在贾母完成所有操作后,玉石中的最大亮度值是多少?
输入格式
第一行输入两个整数N,Q(1≤N≤10⁹,1≤Q≤10⁵)表示玉石的数量和贾母的调整次数。
接下来 Q行,每行三个整数tᵢ,xᵢ,yᵢ(1≤tᵢ≤2,1≤xᵢ≤N,1≤yᵢ≤10⁹)表示一次操作,若tᵢ=1则表示执行操作1,tᵢ=2则执行操作2。
输出格式
输出一个整数表示答案。
import os
import sys
# 初始化两个变量n和q,分别表示数的数量和操作的次数
n, q = map(int, input().split())
# left, right分别表示第一个数的亮度,最后一个数的亮度
left, right = 0, 0
# 遍历每个操作
for i in range(q):
# t表示操作类型,x表示位置,y表示亮度变化值
# t = 1 表示增加亮度, t = 2 表示减少亮度
t, x, y = map(int, input().split())
# 当操作类型为增加亮度
if t == 1:
# 当x == n时,最后一个数才会增大亮度
if x == n:
right += y
# 无论如何,第一个数的亮度都会增加
left += y
# 当操作类型为减少亮度
if t == 2:
# 当x == n时,第一个数的亮度才会减小
if x == n:
left -= y
# 无论如何,最后一个数的亮度都会减少
right -= y
# 输出亮度绝对值较大的数值
print(max(abs(left), abs(right)))
双十一这天,小蓝熬夜到凌晨,就为了抢购限量版机械键盘。困得眼睛都睁不开的他,终于把键盘添加到了购物车,就差最后一步:付款!
然而,当他颤抖着手指准备输入支付密码时,却发现...他不记得密码了? !
好吧这并不要紧,因为小蓝此前设置了动态密码。动态密码是将当天的日期 (八位数字格式)转换成二进制表示形式 (不含前导零)。
对小蓝来说,今天是2024年11月11日 (八位数字格式为:20241111)。现在,请你帮他计算出动态密码,帮他完成支付。
输入格式
无。
输出格式
输出一个数字字符串,表示动态密码。
import os
import sys
# 将十进制数字20241111转换为二进制字符串表示
# 使用内置函数bin()进行转换
a = bin(20241111)
# 输出转换后的二进制字符串,去掉前两个字符'0b'
# [2:]表示从字符串的第三位开始截取,直到字符串的末尾
print(a[2:])
# 转换为8进制
print(oct(20241111))
# 转换为16进制
print(hex(20241111))
# 转换为2进制
print(bin(20241111))
# 转换为10进制
binary_str = bin(20241111)[2:] # 去掉'0b'前缀
print(int(binary_str, 2)) # 使用基数2进行转换
# 转换为4进制
binary_string = bin(20241111)[2:] # 获取二进制字符串并去掉前缀 '0b'
decimal_number = int(binary_string, 2) # 将二进制字符串转换为整数
print(decimal_number)
# 转换为40进制
hex_string = "1F" # 十六进制字符串
decimal_number = int(hex_string, 16) # 将十六进制字符串转换为整数
print(decimal_number)
# 将8进制数字转换为十进制数字
octal_number = "123" # 八进制数字
decimal_number = int(octal_number, 8) # 将八进制数字转换为十进制数字
print(decimal_number)
问题描述
在与三体文明的对抗中,人类联邦探测到了两个重要的信号源,分别用非负整数a和b来表示。
为了抵御三体舰队的入侵,科学家们制定出一项关键策略——屏蔽信号,目标是要让a、b这两个信号源其中之一的数值归零。在实施屏蔽操作时,有着一套既定规则:每次操作,科学家们需要先对比两个信号源的数值大小,然后用较大的那个数减去较小的数,得出差值之后,再把原本较大的那个数替换成这个差值。就这样反复操作,一轮一轮进行下去。
现在,请你来帮忙计算一下,按照这样的操作方式,要想实现将两个信号源之中任意一个变为零,所需要进行的最少操作次数是多少呢?
输入格式
第一行包含一个整数t(1≤t≤10³),表示测试数据的数量。
接下来的t行,每行包含两个非负整数a和(b(0≤a,b≤10⁹),表示两个关键的信号源。
输出格式
对于每组测试数据,输出一个整数,表示将其中一个信号源变为零所需的最小操作次数,每个结果占一行。
import os
import sys
# 请在此输入您的代码
n=int(input())
for i in range(n):
count=0
a,b=map(int,input().split())
while a!=0 and b!=0:
if a>b:
count+=a//b
a=a%b
else:
count+=b//a
b=b%a
print(count)
Excel地址
题目描述
Excel单元格的地址表示很有趣,它使用字母来表示列号。比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
…
当然 Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目即是要求对输入的数字,输出其对应的 Excel地址表示方式。
输入描述
输入一个整数n, 其范围[1,2147483647]。
输出描述
输出n 对应的 Excel地址表示方式。
import os
import sys
# 将整数转换为Excel列标题
# 该代码片段用于将给定的整数n转换为Excel列标题形式的字符串
# Excel列标题由字母组成,类似于"A", "B", ..., "Z", "AA", "AB", ...
n = int(input())
# 初始化结果字符串为空
asd = ""
# 定义一个列表,包含大写字母,用于转换过程
st = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
# 循环直到n为0
while n > 0:
# 减去1以适应0索引
n -= 1
# 计算当前位的字母索引
a = n % 26
# 将当前位的字母添加到结果字符串的开头
asd = st[a] + asd
# 更新n为下一位的值
n = n // 26
# 打印最终的结果字符串
print(asd)
def excel_address(n):
result = []
while n > 0:
n -= 1
result.append(chr(n % 26 + ord('A')))
n //= 26
return ''.join(result[::-1])
# 测试
print(excel_address(53)) # 输出: BA