Skip to content

Commit b4100d3

Browse files
committed
2021.04.20
1 parent d4d0f08 commit b4100d3

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed

python/gold1/17435.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
input = sys.stdin.readline
3+
output = sys.stdout.write
4+
5+
m = int(input())
6+
arr = list(map(int, input().split()))
7+
LCarr = [[0]*21 for _ in range(m+1)]
8+
9+
for i,num in enumerate(arr,1):
10+
LCarr[i][0] = num
11+
12+
for y in range(1,21):
13+
for x in range(1,m+1):
14+
LCarr[x][y] = LCarr[LCarr[x][y-1]][y-1]
15+
16+
def sol(n,x):
17+
for i in range(20,-1,-1):
18+
if n>=1<<i:
19+
n-=(1<<i)
20+
x = LCarr[x][i]
21+
return x
22+
23+
24+
for i in range(int(input())):
25+
n,x = map(int,input().split())
26+
output("%d\n"%sol(n,x))

python/plat2/13263.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import sys
2+
input = sys.stdin.readline
3+
output = sys.stdout.write
4+
5+
class Line(object):
6+
def __init__(self,p,c):
7+
self.p = p
8+
self.c = c
9+
self.s = 0
10+
11+
def cross(l1,l2):
12+
return (l1.c-l2.c)/(l2.p-l1.p)
13+
14+
n = int(input())
15+
tree_height = list(map(int,input().split()))
16+
tree_p = list(map(int,input().split()))
17+
dp_arr = [-1]*(n+1)
18+
dp_arr[0] = 0
19+
st = [None]*(n+1)
20+
top = 0
21+
22+
for i in range(1,n):
23+
l = Line(tree_p[i-1],dp_arr[i-1])
24+
while top>0:
25+
l.s = cross(st[top-1],l)
26+
if st[top-1].s<l.s: break;
27+
top-=1
28+
st[top] = l
29+
top+=1
30+
x = tree_height[i]
31+
idx = top-1
32+
if x<st[idx].s:
33+
l,r = 0,idx
34+
while l+1<r:
35+
mid = (l+r)>>1
36+
if x<st[mid].s:
37+
r = mid
38+
else:
39+
l = mid
40+
idx = l
41+
dp_arr[i] = st[idx].p*x + st[idx].c
42+
print(dp_arr[n-1])

python/plat4/16975.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import sys
2+
input = sys.stdin.readline
3+
output = sys.stdout.write
4+
5+
N = int(input())
6+
st = 1
7+
while st<=N:
8+
st<<=1
9+
tree = [0]*(st<<1)
10+
lazy = [0]*(st<<1)
11+
12+
for idx,num in enumerate(list(map(int,input().split()))):
13+
tree[idx+st] = num
14+
15+
temp = st
16+
while temp>1:
17+
ed = temp
18+
temp>>=1
19+
for idx in range(temp,ed):
20+
tree[idx] = tree[idx<<1]+tree[idx<<1|1]
21+
22+
def propagate(node, ns, ne):
23+
if lazy[node]:
24+
tree[node] +=lazy[node]
25+
if ns!=ne:
26+
lazy[node<<1] += lazy[node]
27+
lazy[node<<1|1] += lazy[node]
28+
lazy[node] = 0
29+
30+
def update(ns,ne,s,e,node,k):
31+
propagate(node,ns,ne)
32+
if ns>e or ne<s : return
33+
if s<=ns and ne<=e:
34+
tree[node]+=k
35+
if ns!=ne:
36+
lazy[node<<1]+=k
37+
lazy[node<<1|1]+=k
38+
return
39+
mid = (ns+ne)>>1
40+
update(ns,mid,s,e,node<<1,k)
41+
update(mid+1,ne,s,e,node<<1|1,k)
42+
tree[node]=tree[node<<1]+tree[node<<1|1]
43+
44+
def query(ns,ne,s,e,node):
45+
propagate(node,ns,ne)
46+
if e<ns or s>ne: return 0
47+
if s<=ns and ne<=e: return tree[node]
48+
mid = (ne+ns)>>1
49+
return query(ns,mid,s,e,node<<1) + query(mid+1,ne,s,e,node<<1|1)
50+
51+
M = int(input())
52+
for i in range(M):
53+
row = list(map(int,input().split()))
54+
if row[0]==1:
55+
update(1,st,row[1],row[2],1,row[3])
56+
else:
57+
output("%d\n"%query(1,st,row[1],row[1],1))

0 commit comments

Comments
 (0)