Upload files to "백준"
This commit is contained in:
76
백준/11438.py
Normal file
76
백준/11438.py
Normal file
@@ -0,0 +1,76 @@
|
||||
import sys
|
||||
from collections import deque
|
||||
imput = sys.stdin.readline
|
||||
N = int(input())
|
||||
tree=[[0] for _ in range(N+1)]
|
||||
|
||||
for _ in range(0, N-1):
|
||||
s, e = map(int, input().split())
|
||||
tree[s].append(e)
|
||||
tree[e].append(s)
|
||||
|
||||
depth = [0] * (N+1)
|
||||
visited = [False] * (N+1)
|
||||
temp = 1
|
||||
kmax = 0 #최대 가능 높이
|
||||
|
||||
while temp <= N:
|
||||
temp <<= 1
|
||||
kmax += 1
|
||||
|
||||
parent = [[0 for j in range(N+1)] for i in range(kmax+1)]
|
||||
|
||||
def BFS(node):
|
||||
queue =deque()
|
||||
queue.append(node)
|
||||
visited[node] = True
|
||||
level = 1
|
||||
count = 0
|
||||
now_size = 1
|
||||
while queue:
|
||||
now_node =queue.popleft()
|
||||
for next in tree[now_node]:
|
||||
if not visited[next]:
|
||||
visited[next] = True
|
||||
queue.append(next)
|
||||
parent[0][next] = now_node
|
||||
depth[next] = level
|
||||
count += 1
|
||||
if count == now_size:
|
||||
count = 0
|
||||
now_size = len(queue)
|
||||
level += 1
|
||||
|
||||
BFS(1)
|
||||
|
||||
for k in range(1, kmax+1):
|
||||
for n in range(1, N+1):
|
||||
parent[k][n] = parent[k-1][parent[k-1][n]]
|
||||
|
||||
def executeLCA(a, b):
|
||||
if depth[a] > depth[b]:
|
||||
temp = a
|
||||
a = b
|
||||
b = temp
|
||||
|
||||
for k in range(kmax, -1, -1):
|
||||
if pow(2, k)<=depth[b] - depth[a]:
|
||||
if depth[a] <= depth[parent[k][b]]:
|
||||
b = parent[k][b]
|
||||
|
||||
for k in range(kmax, -1, -1):
|
||||
if a==b: break
|
||||
if parent[k][a] != parent[k][b]:
|
||||
a= parent[k][a]
|
||||
b=parent[k][b]
|
||||
|
||||
LCA = a
|
||||
if a!=b:
|
||||
LCA = parent[0][LCA]
|
||||
return LCA
|
||||
|
||||
M = int(input())
|
||||
|
||||
for _ in range(M):
|
||||
a, b = map(int, input().split())
|
||||
print(str(executeLCA(a,b)))
|
||||
79
백준/11438_re.py
Normal file
79
백준/11438_re.py
Normal file
@@ -0,0 +1,79 @@
|
||||
import sys
|
||||
from collections import deque
|
||||
|
||||
input = sys.stdin.readline
|
||||
print = sys.stdout.write
|
||||
N = int(input())
|
||||
tree = [[0] for i in range(N+1)]
|
||||
|
||||
for _ in range(N-1):
|
||||
s, e = map(int, input().split())
|
||||
tree[s].append(e)
|
||||
tree[e].append(s)
|
||||
|
||||
depth = [0] * (N+1)
|
||||
visited = [False] * (N+1)
|
||||
temp = 1
|
||||
kmax = 0
|
||||
|
||||
while temp <= N:
|
||||
temp <<= 1
|
||||
kmax += 1
|
||||
|
||||
parent = [[0 for j in range(N+1)] for i in range(kmax + 1)]
|
||||
|
||||
def BFS(node):
|
||||
queue = deque()
|
||||
queue.append(node)
|
||||
visited[node] = True
|
||||
level = 1
|
||||
now_size = 1
|
||||
count = 0
|
||||
while queue:
|
||||
now_node = queue.popleft()
|
||||
for neighbor in tree[now_node]:
|
||||
if not visited[neighbor]:
|
||||
visited[neighbor] = True
|
||||
queue.append(neighbor)
|
||||
parent[0][neighbor] = now_node
|
||||
depth[neighbor] = level
|
||||
count += 1
|
||||
if (count == now_size):
|
||||
count = 0
|
||||
now_size = len(queue)
|
||||
level += 1
|
||||
|
||||
BFS(1)
|
||||
|
||||
for k in range(1, kmax+1):
|
||||
for n in range(1, N+1):
|
||||
parent[k][n] = parent[k-1][parent[k-1][n]]
|
||||
|
||||
def executeLCA(a,b):
|
||||
if depth[a] > depth[b]:
|
||||
temp = a
|
||||
a = b
|
||||
b = temp
|
||||
|
||||
for k in range(kmax, -1, -1):
|
||||
if pow(2, k) <= depth[b] - depth[a]:
|
||||
if depth[a] <= depth[parent[k][b]]:
|
||||
b = parent[k][b]
|
||||
|
||||
for k in range(kmax, -1, -1):
|
||||
if a==b: break
|
||||
if parent[k][a] != parent[k][b]:
|
||||
a= parent[k][a]
|
||||
b=parent[k][b]
|
||||
|
||||
LCA = a
|
||||
if a!=b:
|
||||
LCA = parent[0][LCA]
|
||||
return LCA
|
||||
|
||||
M = int(input())
|
||||
|
||||
for _ in range(M):
|
||||
a, b = map(int, input().split())
|
||||
print(str(executeLCA(a,b)))
|
||||
print("\n")
|
||||
55
백준/11505.py
Normal file
55
백준/11505.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import sys
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
n, m, k = map(int, input().split()) #수의 개수, 변경 횟수, 곱 구하는 횟수
|
||||
|
||||
length = n
|
||||
height = 0
|
||||
MOD = 1000000007
|
||||
|
||||
while length!=0:
|
||||
length //= 2
|
||||
height += 1
|
||||
|
||||
tree_size = pow(2, height + 1)
|
||||
start_tree_left_index = pow(2, height) - 1
|
||||
tree = [1] * (tree_size + 1)
|
||||
|
||||
for i in range(start_tree_left_index+1, start_tree_left_index+ n+1):
|
||||
tree[i] = int(input())
|
||||
|
||||
temp = tree_size
|
||||
|
||||
while temp != 1:
|
||||
tree[temp//2] = tree[temp//2] * tree[temp] % MOD
|
||||
temp -= 1
|
||||
|
||||
def change_val(index, value):
|
||||
tree[index] = value
|
||||
while index > 1:
|
||||
index //= 2
|
||||
tree[index] = tree[index*2] % MOD * tree[index*2+1] %MOD
|
||||
|
||||
def mux(s, e):
|
||||
result = 1
|
||||
while s<=e:
|
||||
if s%2==1:
|
||||
result = tree[s] * result % MOD
|
||||
s+=1
|
||||
if e%2==0:
|
||||
result = tree[e] * result % MOD
|
||||
e-=1
|
||||
s //= 2
|
||||
e //= 2
|
||||
return result
|
||||
|
||||
|
||||
for i in range(m+k):
|
||||
mode, s, e = map(int, input().split())
|
||||
s += start_tree_left_index
|
||||
if (mode == 1):
|
||||
change_val(s, e)
|
||||
else:
|
||||
e += start_tree_left_index
|
||||
print(mux(s, e))
|
||||
21
백준/11660.py
Normal file
21
백준/11660.py
Normal file
@@ -0,0 +1,21 @@
|
||||
import sys
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
n, m = map(int,input().split())
|
||||
|
||||
arr = []
|
||||
arr_sum = [[0]*1025 for i in range(1025)]
|
||||
|
||||
for i in range(n):
|
||||
arr.append(list(map(int, input().split())))
|
||||
|
||||
for j in range(1, n+1):
|
||||
for k in range(1, n+1):
|
||||
arr_sum[j][k] = arr_sum[j][k-1] + arr_sum[j-1][k] - arr_sum[j-1][k-1] + arr[j-1][k-1]
|
||||
|
||||
for i in range(m):
|
||||
x1, y1, x2, y2 = map(int, input().split())
|
||||
result = 0
|
||||
result = arr_sum[x2][y2] + arr_sum[x1-1][y1-1] - arr_sum[x1-1][y2] - arr_sum[x2][y1-1]
|
||||
print(result)
|
||||
18
백준/11689.py
Normal file
18
백준/11689.py
Normal file
@@ -0,0 +1,18 @@
|
||||
import sys
|
||||
import math
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
N = int(input())
|
||||
result = N
|
||||
|
||||
for i in range(2, int(math.sqrt(N))+1):
|
||||
if (N%i==0):
|
||||
result -= result / i
|
||||
while (N%i==0):
|
||||
N /= i
|
||||
|
||||
if N>1:
|
||||
result -= result / i
|
||||
|
||||
print(int(result))
|
||||
Reference in New Issue
Block a user