1. Altere os elementos da matriz (diferença)
Método 1: matriz de diferenças
map(int,input().split())
Isso retorna um objeto, não um inteiro
para b em arr[:n]:
arr[:n] é uma operação de divisão em Python que representa a sublista desde o início (índice 0) até o n-1º elemento da lista arr.
print(1 if b else 0,end=' ')
O que esse código faz é converter o valor booleano b em um número inteiro e imprimi-lo. Se b for True, imprima 1, caso contrário imprima 0. O end=' ' no código significa que o resultado impresso não será quebrado, mas finalizado com um espaço.
#只用关心某个数字位置是否被覆盖过,不关心覆盖过几次
for i in range(int(input())):#读入输入数组的次数
n,a=int(input()),list(map(int,input().split()))#前面是传入一个数,后面传的一个数组
arr=[0]*(n+5)#数组的大小
for j in range(n):
arr[max(0,j-a[j]+1)]+=1
arr[j+1]-=1
for j in range(1,n):
arr[j]+=arr[j-1]#差分数组
for b in arr[:n]:
print(1 if b else 0,end=' ')#这个用法好绝,对于初学者来说
print()#换行
Método 2: Mesclagem de intervalo
Este código é um algoritmo para lidar com problemas de intervalo, que implementa principalmente as seguintes etapas:
1. Leia um inteiro n e uma lista de inteiros a de comprimento n.
2. Para cada elemento a[j] na lista a, se não for zero, adicione o intervalo [max(0, ja[j]+1), j] à lista de intervalos.
3. Classifique a lista de intervalos de acordo com o ponto final esquerdo do intervalo.
4. Para cada intervalo na lista de intervalos classificados, marque todos os elementos no intervalo como 1 na lista arr.
5. Emita a lista arr marcada.
Pode-se ver que a complexidade de tempo do algoritmo é O(nlogn) e a operação mais demorada é a classificação da lista de intervalos.
intervalo.sort(key=lambda x:x[0])
Este código é classificado de acordo com o endpoint esquerdo, se você quiser classificar de acordo com o endpoint direito
intervalo.sort(key=lambda x: x[1])
for i in range(int(input())):#input()返回为str,转换为int
n,a=int(input()),list(map(int,input().split()))#输入数组大小及数组元素
arr,interval=[0]*n,[]
for j in range(n):
if a[j]:
interval.append([max(0,j-a[j]+1),j])#记录区间
interval.sort(key=lambda x:x[0])#按照区间端点进行排序
if interval:#检查interval是否为空,若为空则直接输出长度为n的全0数组,
# 如果不为空,则按照一定的规则将1填充到arr数组中
p=1#编号为0的区间
for j in range(1,len(interval)):
if interval[j][0]>interval[p-1][1]+1:#如果区间左端点大于编号为p-1的一个区间右端点+1,则说明这是两个区间
interval[p]=interval[j]
p+=1
else:#如果在内部,则可以这两个区间
interval[p-1][1]=max(interval[p-1][1],interval[j][1])
for j in range(p):#枚举每个区间,将每个区间内所包含的置1
for k in range(interval[j][0],interval[j][1]+1):
arr[k]=1
for a in arr:
print(a,end=' ')
print()
Observe o recuo! ! !
Em segundo lugar, a diferença
a = [0] + list(map(int, input().split())) + a[n + 1:]
A função dessa linha de código é substituir os elementos do subscrito 1 até n (incluindo 1 e n) na lista a pelos elementos de entrada e adicionar um 0 no início e no final da lista para garantir que as operações subsequentes não aparece Erro de índice. especificamente:
a[:n+1] significa os elementos do índice 0 até n, onde a[0] é o primeiro elemento da lista, a[n] é o último elemento da lista, a[n+1:] significa de Todos os elementos do subscrito n+1 até o final da lista.
Portanto, o efeito de a = [0] + list(map(int, input().split())) + a[n +1:] é primeiro adicionar 0 ao início da lista e, em seguida, adicionar o elementos de entrada para Na posição original, finalmente adicione todos os elementos do original n+1 ao final da lista, obtendo assim uma nova lista a de comprimento n+2.
n,q=map(int,input().split())
a=[0]*(n+10)
b=[0]*(n+10)
#a的0位是0,第1位到第n位是输入的数,第n+1位起往后都是0
a=[0]+list(map(int,input().split()))+a[n+1:]
for i in range(1,n+1):
b[i]=a[i]-a[i-1]#初始化b数组
while q:
l,r,c=map(int,input().split())
b[l]+=c
b[r+1]-=c
q-=1
#a数组没有用了,将a更新一遍
for i in range(1,n+1):
a[i]=a[i-1]+b[i]
print(a[i],end=' ')
3. Matriz de diferenças
Método de escrita um:
def insert(matrix,x1,y1,x2,y2,c):#差分数组
matrix[x1][y1]+=c
matrix[x2+1][y1]-=c
matrix[x1][y2+1]-=c
matrix[x2+1][y2+1]+=c
def main():
n, m, q = map(int, input().split())
matrix=[[0 for i in range(m+10)] for j in range(n+10)]#定义二维数组
for i in range(1,n+1):
row =list(map(int, input().split()))
for j in range(m):
insert(matrix,i,j+1,i,j+1,row[j])
for i in range(q):
x1,y1,x2,y2,c=map(int,input.split())
insert(matrix,x1,y1,x2,y2,c)
for i in range(1,n+1):
for j in range(1,m+1):
matrix[i][j]+=matrix[i-1][j]+matrix[i][j-1]-matrix[i-1][j-1]
print(matrix[i][j],end=" ")
print()
if __name__=="__main__":
main()
Método de escrita dois:
print(" ".join(map(str,dt[i][1:m+1])))
Essa linha de código converte os elementos na lista dt[i][1:m+1] em strings, concatena-os com espaços e os imprime. em:
- map(str, dt[i][1:m+1]) significa converter cada elemento na lista dt[i][1:m+1] em um tipo string;
- " ".join(…) significa juntar os elementos na lista de strings com espaços para formar uma nova string;
- print(…) significa imprimir a string concatenada.
def insert(b,x1,y1,x2,y2,c):
b[x1][y1] += c
b[x2+1][y1] -= c
b[x1][y2+1] -= c
b[x2+1][y2+1] += c
n,m,q = map(int,input().split())
ls = []
dt = [[0 for _ in range(1010)] for _ in range(1010)]
for i in range(n):
ls.append(list(map(int,input().split())))
for i in range(1,n+1):
for j in range(1,m+1):
insert(dt,i,j,i,j,ls[i-1][j-1])
while q >0:
q -= 1
x1,y1,x2,y2,c = map(int,input().split())
insert(dt,x1,y1,x2,y2,c)
for i in range(1,n+1):
for j in range(1,m+1):
dt[i][j] +=dt[i-1][j]+dt[i][j-1] - dt[i-1][j-1]
for i in range(1,n+1):
print(" ".join(map(str,dt[i][1:m+1])))
4. Aumente e diminua a sequência
A diferença resolve o problema de aumento ou diminuição simultânea em uma seção de área
. Adicione uma constante c ao intervalo [L, R], então b[L] += c , b[R + 1] -=c
Encontre a sequência de diferenças b de a, onde b1 = a1, b(i) = a(i) - a(i - 1) (2 <= i <= n). Seja b(n + 1) = 0, a operação do título na sequência a é equivalente a selecionar quaisquer dois números em b1, b2...b(n + 1) de cada vez, adicionando 1 a um e subtraindo 1 de o outro. O objetivo é mudar b2,b3,...bn para todos os 0s. A sequência final a é composta por n b1
O método de escolha de dois números pode ser dividido em quatro categorias
1, 2 <= i , j <= n (prioridade)
2, i = 1, 2 <= j <= n
3, 2 <= i <= n , j = n + 1
4, i = 1, j = n + 1 (não faz sentido)
Seja a soma dos números positivos em b2, b3...bn p, e o valor absoluto da soma dos números negativos seja q. Primeiro, tente executar operações do tipo 1 combinando números positivos e negativos, e você pode executar min(p,q) vezes. As correspondências |p - q| restantes são pares, cada um dos quais pode ser selecionado para corresponder a b1 ou b(n + 1), ou seja, para realizar 2 ou 3 tipos de operações, exigindo um total de |p - q| vezes
Em resumo, o número mínimo de operações é min(p,q) + |p - q|. De acordo com a seleção das 2ª e 3ª operações de |p - q| vezes, diferentes valores de b1 em |p - q| + 1 podem ser gerados, ou seja, a sequência final a pode ter |p - q| + 1 tipos
print(f"{max(pos, neg)}\n{abs(pos - neg) + 1}")
Esta é uma maneira de escrever f-string, que é usada para formatar strings. Entre eles, a parte dentro das chaves será substituída pelo valor da variável ou expressão correspondente. Especificamente:
f"xxx": Indica que esta é uma string f, onde xxx é o conteúdo da string, que pode conter texto comum e expressões de colchetes.
{max(pos, neg)}: Indica uma expressão de colchetes, que será substituída pelo valor máximo de pos e neg.
\n: Indica um caractere de nova linha.
{abs(pos - neg) + 1}: Indica uma expressão de colchetes, que será substituída pelo valor absoluto da diferença entre pos e neg mais 1.
n = int(input())
a = [0] * (n + 2)
for i in range(1,n+1):
x = int(input())
a[i] += x
a[i+1] -= x
pos, neg = 0, 0
for i in range(2, n+1):
if a[i] > 0:
pos += a[i]
else:
neg -= a[i]
print(f"{
max(pos, neg)}\n{
abs(pos - neg) + 1}")