반응형

문제 출처 :


https://www.acmicpc.net/problem/2042



알고리즘 분석 :


문제 해결에 필요한 사항

1. 세그먼트 트리 :: http://www.crocus.co.kr/648


사실 이 문제를 이전에 C++로 푼 내용이 있다. :: http://www.crocus.co.kr/649


따라서 위의 링크를 타고 가서 문제 내용을 이해하면 되고, 파이썬에서 무얼 이용했는지만 설명하고자 한다.


우선 파이썬3에서 이용되는 input() 메서드를 이용하면 TLE가 나온다.


input 메서드 자체가 시간 복잡도면으로 무거운 면이 있는지 절대 알고리즘이 같아도 정답이 나오지 않는다.


따라서 import sys를 하고 sys.stdin.readline()을 이용하여 인풋을 받고 그것을 split하여 각 변수에 넣어주는 과정을 이용한다.


그리고 C++에서는 vector<int> &arr, vector<int> &tree로 참조식으로 썼지만, 파이썬에서는 매개변수 자체가 참조를 이용하고 있으므로 따로 참조구문을 쓰지 않아도 된다.


나머지는 C++ 코드와 동일하다.













소스 코드 : 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from math import *
import sys
 
def init(arr, tree, node, start, end):
 
    if start == end:
        tree[node] = arr[start]
        return tree[node]
 
    mid = (start + end) // 2
 
    tree[node] = init(arr, tree, node*2, start, mid) + init(arr, tree, node*2+1, mid+1, end)
    return tree[node]
 
def update(tree, node, start, end, index, diff):
    if not (start <= index and index <= end):
        return
 
    tree[node] += diff
 
    if start == end: # update finish
        return
 
    elif start != end:
        mid = (start + end) // 2
        update(tree, node * 2, start, mid, index, diff)
        update(tree, node * + 1, mid + 1, end, index, diff)
 
def query(tree, node, start, end, left, right):
    if start > right or end < left:
        return 0
 
    if left <= start and end <= right:
        return tree[node]
 
    mid = (start + end) // 2
    return query(tree, node * 2, start, mid, left, right) + query(tree, node * 2+ 1, mid + 1, end, left, right)
 
 
n,m,k = [int(x) for x in sys.stdin.readline().split()]
 
= int(ceil(log2(n)))
tree_size = << (h+1)
 
arr = [0]*(n+1)
tree = [0]*(tree_size)
 
for i in range(n):
    arr[i] = int(sys.stdin.readline())
 
init(arr, tree, 1, n-1)
+= k
 
while m:
    val,a,b = [int(x) for x in sys.stdin.readline().split()]
 
    if val == 1:
        diff = b - arr[a - 1]
        arr[a-1= b
        update(tree, 10, n - 1, a-1, diff)
 
    elif val == 2:
        print(query(tree, 1,0,n-1,a-1,b-1))
 
    m -= 1
 
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus

반응형