Rückblick auf den AtCoder Beginner Contest 157 bis Frage E (Python)

Dies ist ein Übersichtsartikel für Anfänger von Wettkampfprofis.

Die Lösung, die ich hier schreibe, wurde geschrieben, während ich mir den Kommentar und die Beiträge anderer Leute ansah. Es ist möglicherweise nicht das, was Sie tatsächlich eingereicht haben.

A - Duplex Printing

Die Frage ist, wie viele Blätter Papier für den doppelseitigen Druck von N Seiten benötigt werden.

Durch 2 teilen und aufrunden.

n = int(input())
print((n+1)//2)

B - Bingo Die Frage ist zu beantworten, ob die angegebenen Zahlen und Bingokarten ausgerichtet sind.

Es war umständlich, das zweidimensionale Array zu durchsuchen, um das Element zu finden, daher habe ich die Operation des Ersetzens durch "np.where" mit "numpy" verwendet. Ich habe auch das Vorhandensein von Bingo überprüft, indem ich "np.sum ()" entlang der vertikalen und horizontalen Achse verwendet habe.

Beachten Sie, dass pypy3 numpy nicht lesen kann.

import numpy as np
S = np.array([list(map(int, input().split())) for _ in range(3)])
n = int(input())
for _ in range(n):
    S = np.where(S==int(input()), 0, S)
HBingo = min(np.sum(S, axis=0)) == 0
WBingo = min(np.sum(S, axis=1)) == 0
SBingo = S[2][0] == 0 and S[1][1] == 0 and S[0][2] == 0
BSBingo = S[0][0] == 0 and S[1][1] == 0 and S[2][2] == 0
if HBingo or WBingo or SBingo or BSBingo:
    print('Yes')
    exit()
print('No')

Es scheint jedoch viel schneller zu sein, das Array gehorsam zu durchsuchen, ohne numpy zu verwenden.

C - Guess The Number

Es ist ein Problem, die Mindestanzahl zurückzugeben, die die Bedingungen für die Anzahl der empfangenen Ziffern und die Anzahl erfüllt.

Erstellen Sie zunächst jede Ziffer mit "-1" als Ausgangszustand. Jedes Mal, wenn eine Eingabe von ihr empfangen wird, wird sie neu geschrieben, wenn entweder "der neu zu schreibende Wert ist -1" oder "die neu zu schreibende Zahl steht nicht in Konflikt" erfüllt ist. Wenn ein Konflikt auftritt, geben Sie -1 aus und beenden Sie das Programm.

Konvertieren Sie abschließend die Ziffer (-1), die nicht neu geschrieben wurde, in den Mindestwert, und Sie sind fertig. Konvertieren Sie in 1, wenn es die erste Ziffer von links ist (beachten Sie, dass 0 zulässig ist, wenn N = 1 ist), und in 0, wenn es danach ist.

Beachten Sie, dass die erste Ziffer nicht auf 0 geändert werden kann, wenn $ N \ geq2 $ (ein Verlust).

N, M = map(int, input().split())
ans = [-1] * N
for _ in range(M):
    i, n = map(int, input().split())
    if (ans[i-1] == -1 or ans[i-1] == n) and not(N > 1 and i == 1 and n == 0):
        ans[i-1] = n
    else:
        print(-1)
        exit()
ans = [n if n != -1 else 0 for n in ans]
if ans[0] == 0 and N > 1:
    ans[0] = 1

print(*ans, sep='')

D - Friend Suggestions

Angesichts des Status von SNS ist es eine Frage, wie viele Beziehungen "Freunde von Freunden" und "weder Freunde noch Feinde" sind.

Ich wusste nicht, wie ich herausfinden sollte, ob sie verbunden waren, also gab ich auf.

Ich habe den Kommentar gesehen. Die Anzahl der Freundeskandidaten ist die Anzahl, die durch Subtrahieren von "Anzahl Ihrer Freunde", "Anzahl Ihrer Freunde (1)" und "Anzahl der Personen, die im Cluster blockieren" von "Anzahl der Personen im Cluster, zu denen Sie gehören" erhalten wird. Wird sein.

Daher wird als Array das Array "ClusterI", in dem "der Cluster, zu dem jedes Element gehört", das Array "ClusterN", in dem "die Anzahl der Personen in jedem Cluster" gespeichert ist, und die "Anzahl der Personen, die mit Freunden blockieren" gespeichert, die später gezeichnet werden sollen. Erstellen Sie drei Arrays von out.

clusterI speichert den niedrigsten Index im Cluster. Das ist das Problem. Der folgende Code ändert den Vorgang des Umschreibens des Index mit for.

n, m, k = map(int, input().split())
clusterN = [1] * n
clusterI = list(range(n))
out = [0] * n

def unite(x, y):
  CX = clusterI[x]
  CY = clusterI[y]
  if CX != CY:
    if CX < CY:
      CX, CY = CY, CX
    clusterN[CX] += clusterN[CY]
    for i in range(n):
      if clusterI[i] == CY:
        clusterI[i] = CX

for _ in range(m):
  a, b = map(int, input().split())
  unite(a-1, b-1)
  out[a-1] -= 1
  out[b-1] -= 1

for _ in range(k):
  a, b = map(int, input().split())
  if clusterI[a-1] == clusterI[b-1]:
    out[a-1] -= 1
    out[b-1] -= 1
out = [out[i] + clusterN[clusterI[i]] - 1 for i in range(n)]
print(*out)

Das ist TLE.

Ich habe es mit einer rekursiven Funktion umgeschrieben und dabei auf den Code anderer Leute verwiesen. Ich ging daran vorbei. Die große Herausforderung besteht darin, dass Sie nicht über das Wissen über Exploration verfügen.

n, m, k = map(int, input().split())
clusterN = [1] * n
clusterI = list(range(n))
out = [0] * n
def find(x):
  if clusterI[x] != x:
    minI = find(clusterI[x])
    clusterI[x] = minI
    return minI
  else:
    return x

def unite(x, y):
  CX = find(x)
  CY = find(y)
  if CX != CY:
    if CX > CY:
      CX, CY = CY, CX
      x, y = y, x
    clusterN[CX] += clusterN[CY]
    clusterI[CY] = CX
    
for _ in range(m):
  a, b = map(int, input().split())
  unite(a-1, b-1)
  out[a-1] -= 1
  out[b-1] -= 1

for _ in range(k):
  a, b = map(int, input().split())
  if find(a-1) == find(b-1):
    out[a-1] -= 1
    out[b-1] -= 1
out = [out[i] + clusterN[find(i)] - 1 for i in range(n)]
print(*out)

E - Simple String Queries

Es ist ein Problem, die Anzahl der Zeichentypen zu überprüfen, indem der Vorgang des Konvertierens der Zeichenfolge gemäß der Eingabe wiederholt wird.

Der folgende Code ist der, den ich wie gewohnt gemacht habe.

import collections

N = int(input())
S = list(input())
Q = int(input())
for _ in range(Q):
    Q1, Q2, Q3 = input().split()
    if Q1 == '1':
        S[int(Q2)-1] = ord(Q3)
    else:
        print(len(collections.Counter(S[int(Q2)-1: int(Q3)])))

TLE kam heraus.

Ich habe mir den Kommentar angesehen.

Erstellen Sie ein Array mit 26 Elementen mit Informationen zu A bis Z. Die Position, an der das Zeichen angezeigt wird, wird im Element gespeichert. Überprüfen Sie beim Zählen, ob 26 Zeichen vorhanden sind, um festzustellen, ob sie innerhalb des angegebenen Bereichs liegen.

Das Folgende ist die Implementierung davon, wie es ist.

N = int(input())
S = list(str(input()))

def ordN(x):
  return ord(x) - ord('a')

li = [[] for _ in range(26)]
for i,s in enumerate(S):
  li[ordN(s)].append(i)

for i in range(int(input())):
  Q1, Q2, Q3 = input().split()
  if Q1 == "1":
    Q2 = int(Q2) - 1
    if S[Q2] != Q3:
      li[ordN(S[Q2])] = [n for n in li[ordN(S[Q2])] if n != Q2]
      li[ordN(Q3)].append(Q2)
      S[Q2] = Q3
  else:
    Q2, Q3 = int(Q2)-1, int(Q3)-1
    count = 0
    for j in range(26):
      if [True for n in li[j] if Q2 <= n and n <= Q3]:
        count += 1
    print(count)

Bei dieser Rate wird TLE weiterhin angezeigt. Schreiben Sie unter Bezugnahme auf den Code anderer Personen neu. Hält die Erscheinungsposition von Zeichen in einem sortierten Zustand. Zusätzlich werden Ersatz und Positionsprüfung durch Dichotomie durchgeführt. Die Bibliothek "Halbierung" wird für die Dichotomie verwendet.

Die folgenden zwei Funktionen werden verwendet. bisect.bisect_left(list, x)

a = [1, 2, 4, 6, 10]
print(bisect.bisect_left(a, 4)) # 3

Gibt die Position zurück, an der das zweite Argument in die Liste des ersten Arguments eingegeben werden kann, ohne die Sortierreihenfolge zu unterbrechen. bisect.insort(list, x)

a = [1, 2, 4, 6, 10]
bisect.insort(a, 4)
print(a)# [1, 2, 4, 4, 6, 10]

Fügt sich in die Liste des ersten Arguments ein, ohne die Sortierreihenfolge zu unterbrechen.

Der folgende Code wurde damit umgeschrieben.

import bisect

N = int(input())
S = list(str(input()))

def ordN(x):
  return ord(x) - ord('a')

li = [[] for _ in range(26)]
for i,s in enumerate(S):
  li[ordN(s)].append(i)

for i in range(int(input())):
  Q1, Q2, Q3 = input().split()
  if Q1 == "1":
    Q2 = int(Q2) - 1
    if S[Q2] != Q3:
      I = bisect.bisect_left(li[ordN(S[Q2])], Q2)
      li[ordN(S[Q2])].pop(I)
      bisect.insort(li[ordN(Q3)], Q2)
      S[Q2] = Q3
  else:
    Q2, Q3 = int(Q2)-1, int(Q3)-1
    count = 0
    for j in range(26):
      I = bisect.bisect_left(li[j], Q2)
      if I < len(li[j]) and li[j][I] <= Q3:
        count += 1
    print(count)

Ich ging daran vorbei.

Das ist alles für diesen Artikel.

Recommended Posts

Rückblick auf den AtCoder Beginner Contest 159 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 163 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 164 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 162 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 154 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 153 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 160 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 167 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 157 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 161 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 155 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 156 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 166 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 165 bis Frage E (Python)
atcoder Review des Panasonic Programming Contest 2020, bis zu Frage E (Python)
Überprüfung des Atcoders ABC158 bis Frage E (Python)
AtCoder Beginner Contest 102 Rückblick auf frühere Fragen
AtCoder Beginner Contest 072 Rückblick auf frühere Fragen
AtCoder Beginner Contest 085 Rückblick auf frühere Fragen
AtCoder Beginner Contest 113 Rückblick auf frühere Fragen
AtCoder Beginner Contest 074 Rückblick auf frühere Fragen
AtCoder Beginner Contest 051 Rückblick auf frühere Fragen
AtCoder Beginner Contest 127 Rückblick auf frühere Fragen
AtCoder Beginner Contest 119 Rückblick auf frühere Fragen
AtCoder Beginner Contest 151 Rückblick auf frühere Fragen
AtCoder Beginner Contest 075 Rückblick auf frühere Fragen
AtCoder Beginner Contest 054 Rückblick auf frühere Fragen
AtCoder Beginner Contest 110 Rückblick auf frühere Fragen
AtCoder Beginner Contest 117 Rückblick auf frühere Fragen
AtCoder Beginner Contest 070 Rückblick auf frühere Fragen
AtCoder Beginner Contest 105 Rückblick auf frühere Fragen
AtCoder Beginner Contest 112 Rückblick auf frühere Fragen
AtCoder Beginner Contest 076 Rückblick auf frühere Fragen
AtCoder Beginner Contest 069 Rückblick auf frühere Fragen
AtCoder Beginner Contest 056 Rückblick auf frühere Fragen
AtCoder Beginner Contest 087 Rückblick auf frühere Fragen
AtCoder Beginner Contest 067 Rückblick auf frühere Fragen
AtCoder Beginner Contest 093 Rückblick auf frühere Fragen
AtCoder Beginner Contest 046 Rückblick auf frühere Fragen
AtCoder Beginner Contest 049 Rückblick auf frühere Fragen
AtCoder Beginner Contest 081 Rückblick auf frühere Fragen
AtCoder Beginner Contest 047 Rückblick auf frühere Fragen
AtCoder Beginner Contest 060 Rückblick auf frühere Fragen
AtCoder Beginner Contest 057 Rückblick auf frühere Fragen
AtCoder Beginner Contest 121 Rückblick auf frühere Fragen
AtCoder Beginner Contest 126 Rückblick auf frühere Fragen
AtCoder Beginner Contest 103 Rückblick auf frühere Fragen
AtCoder Beginner Contest 061 Rückblick auf frühere Fragen
AtCoder Beginner Contest 059 Rückblick auf frühere Fragen
AtCoder Beginner Contest 044 Rückblick auf frühere Fragen
AtCoder Beginner Contest 083 Rückblick auf frühere Fragen
AtCoder Beginner Contest 048 Rückblick auf frühere Fragen
AtCoder Beginner Contest 124 Rückblick auf frühere Fragen
AtCoder Beginner Contest 097 Rückblick auf frühere Fragen
AtCoder Beginner Contest 088 Rückblick auf frühere Fragen
AtCoder Beginner Contest 092 Rückblick auf frühere Fragen
AtCoder Beginner Contest 099 Rückblick auf frühere Fragen
AtCoder Beginner Contest 065 Rückblick auf frühere Fragen
AtCoder Beginner Contest 053 Rückblick auf frühere Fragen
AtCoder Beginner Contest 094 Rückblick auf frühere Fragen
AtCoder Beginner Contest 063 Rückblick auf frühere Fragen