小红的区间计数
考点:模拟
思路:
直接一个循环,判断区间内有多少个跟a,b,c都不同的数。
复杂度:O(n)
python
import sys
input = sys.stdin.readline
a,b,c,l,r=map(int,input().split())
cnt=0
for i in range(l,r+1):
if i!=a and i!=b and i!=c:
cnt+=1
print(cnt)
小红的牛魔
考点:栈
思路:
题目说的是能否删掉对应的niu或者mo的子串,那么我们直接用栈,匹配到哪一个就开删就行了。最后再判断栈是不是空的,如果是空的那就是Yes,否则就是No。
复杂度:O(n)
python
import sys
input = sys.stdin.readline
n=int(input())
s=input().strip()
p=[]
for v in s:
if v=='u' and len(p)>=2 and p[-2]=='n' and p[-1]=='i':
p.pop()
p.pop()
elif v=='o' and len(p)>=1 and p[-1]=='m':
p.pop()
else:
p.append(v)
if len(p)==0:
print("Yes")
else:
print("No")
小红的矩阵计数
考点:模拟
思路:
他说了每个格子只有三种状态,又是每次只看2*2的格子内的,于是我们可以一个个找每个2*2的格子里面有多少个满足条件的L即可。
复杂度:O(n*m)
python
import sys
input = sys.stdin.readline
n,m=map(int,input().split())
a=[list(input().strip()) for _ in range(n)]
cnt=0
for i in range(n-1):
for j in range(m-1):
c1=a[i][j]
c2=a[i][j+1]
c3=a[i+1][j]
c4=a[i+1][j+1]
if c1!=c2 and c2!=c3 and c1!=c3:
cnt+=1
if c1!=c2 and c2!=c4 and c1!=c4:
cnt+=1
if c1!=c3 and c3!=c4 and c1!=c4:
cnt+=1
if c2!=c3 and c3!=c4 and c2!=c4:
cnt+=1
print(cnt)import sys
input = sys.stdin.readline
n,m=map(int,input().split())
a=[list(input().strip()) for _ in range(n)]
cnt=0
for i in range(n-1):
for j in range(m-1):
c1=a[i][j]
c2=a[i][j+1]
c3=a[i+1][j]
c4=a[i+1][j+1]
if c1!=c2 and c2!=c3 and c1!=c3:
cnt+=1
if c1!=c2 and c2!=c4 and c1!=c4:
cnt+=1
if c1!=c3 and c3!=c4 and c1!=c4:
cnt+=1
if c2!=c3 and c3!=c4 and c2!=c4:
cnt+=1
print(cnt)
小红的排序(easy)
考点:并查集
思路:
图论中有一个性质,只要再同一个连通块中,我们最后都能换到相应的位置里去,于是问题就转换成判断当前位置和当前位置的值是否处于同一个连通块中。
复杂度:O(n)
python
import sys
import math
input = sys.stdin.readline
sys.setrecursionlimit(300000)
t=int(input())
for _ in range(t):
n,x,y=map(int,input().split())
a=list(map(int,input().split()))
parent=list(range(n+1))
def find(i):
if i ==parent[i]:
return i
parent[i]=find(parent[i])
return parent[i]
def union(i,j):
root_i=find(i)
root_j=find(j)
if root_i!=root_j:
parent[root_i]=root_j
for i in range(1,n-x+1):
union(i,i+x)
for i in range(1,n-y+1):
union(i,i+y)
ok=True
for i in range(n):
val=a[i]
if find(i+1)!=find(val):
ok=False
break
if ok:
print("Yes")
else:
print("No")
小红的三角形构造
考点:构造
思路:
一个数学问题,当x<=2的时候直接输出no,因为题目要是直角三角形。
当x大于2的时候,不管x给的是奇数还是偶数,我们都默认把它放在直角边来进行构造,现在我们在进行分类讨论:
当x是奇数的时候,现在就变成了。于是我们可以设c-b为1,c+b为
,然后联立解方程即可。
当x是偶数的时候,现在就变成了。于是我们可以设c-b为2,c+b为
,然后联立解方程即可。
复杂度:O(n)
python
import sys
import math
input = sys.stdin.readline
t=int(input())
for _ in range(t):
x=int(input())
if x<=2:
print("No")
else:
print("Yes")
if x%2==0:
print(f"{x} {(x**2+4)//4} {(x**2-4)//4}")
else:
print(f"{x} {(x ** 2 + 1) // 2} {(x ** 2 - 1) // 2}")