Skip to content

Commit 781ba59

Browse files
committed
2021.02.02
1 parent 9688963 commit 781ba59

File tree

9 files changed

+428
-0
lines changed

9 files changed

+428
-0
lines changed

python/plat3/10254.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import sys
2+
import math
3+
input = sys.stdin.readline
4+
5+
T = int(input())
6+
def ccw(p1,p2,p3):
7+
def getD(p1,p2):
8+
return p2[0] - p1[0], p2[1] - p1[1]
9+
v,u = getD(p1,p2), getD(p2,p3)
10+
if v[0] * u[1] > v[1] * u[0]: return True
11+
return False
12+
13+
def dist(p1,p2):
14+
return math.pow(p1[0]-p2[0],2)+math.pow(p1[1]-p2[1],2)
15+
16+
def convex(p):
17+
convex = []
18+
for p3 in p:
19+
while len(convex)>=2:
20+
p1,p2 = convex[-2],convex[-1]
21+
if ccw(p1,p2,p3):break
22+
convex.pop()
23+
convex.append(p3)
24+
return convex
25+
26+
def rotating_calipers(arr):
27+
ret = 0
28+
ans = None
29+
l = len(arr)-1
30+
j = 1
31+
for i in range(l):
32+
ni = (i+1)%l
33+
while True:
34+
nj = (j+1)%l
35+
vx = arr[ni][0] - arr[i][0]
36+
vy = arr[ni][1] - arr[i][1]
37+
38+
ux = arr[nj][0] - arr[j][0]
39+
uy = arr[nj][1] - arr[j][1]
40+
41+
tmp = (0,0)
42+
43+
if ccw(tmp,(vx,vy),(ux,uy)):
44+
j = nj
45+
else:break
46+
tmp = dist(arr[i],arr[j])
47+
if tmp>ret:
48+
ans = arr[i]+arr[j]
49+
ret = tmp
50+
return ans
51+
while T:
52+
T-=1
53+
C = int(input())
54+
arr = [list(map(int,input().split())) for _ in range(C)]
55+
56+
arr.sort(key=lambda x:(x[0],x[1]))
57+
convex_hull = convex(arr)
58+
arr.reverse()
59+
tmp = convex(arr)
60+
convex_hull.extend(tmp[1:])
61+
print(' '.join(map(str,rotating_calipers(convex_hull))))

python/plat3/11281.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import sys
2+
input = sys.stdin.readline
3+
sys.setrecursionlimit(100000)
4+
5+
N, M = map(int,input().split())
6+
dfsn = [0]*(N<<1|1)
7+
cnt = 0
8+
SN = 0
9+
st = []
10+
sccNum = [0]*(N<<1|1)
11+
finished = [False]*(N<<1|1)
12+
scc_arr = []
13+
def scc(curr):
14+
global cnt, SN
15+
dfsn[curr] = cnt+1
16+
cnt+=1
17+
st.append(curr)
18+
result = dfsn[curr]
19+
for nx in adj[curr]:
20+
if dfsn[nx]==0:result = min(result,scc(nx))
21+
elif not finished[nx]: result = min(result,dfsn[nx])
22+
23+
if result==dfsn[curr]:
24+
curSCC = []
25+
while True:
26+
t = st.pop()
27+
curSCC.append(t)
28+
finished[t]=True
29+
sccNum[t]=SN
30+
if t==curr:break
31+
SN+=1
32+
scc_arr.append(curSCC)
33+
34+
return result
35+
def oppo(n):return n-1 if n%2 else n+1
36+
37+
adj = [[] for _ in range(2*N+1)]
38+
for _ in range(M):
39+
a,b=map(int,input().split())
40+
a = -(a+1)*2 if a<0 else 2*a-1
41+
b = -(b+1)*2 if b<0 else 2*b-1
42+
adj[oppo(a)].append(b)
43+
adj[oppo(b)].append(a)
44+
45+
for i in range(N*2):
46+
if dfsn[i]==0:scc(i)
47+
48+
def sol():
49+
#print(scc_arr)
50+
for i in range(N):
51+
if sccNum[i<<1] ==sccNum[i<<1|1]:
52+
print(0)
53+
return
54+
result = [-1]*(N+1)
55+
p = [(sccNum[i],i) for i in range(N*2)]
56+
p.sort()
57+
for num in range(N*2-1,-1,-1):
58+
var = p[num][1]
59+
if result[var//2] == -1:
60+
result[var//2] = 0 if var%2 else 1
61+
print(1)
62+
print(' '.join(map(str,result[:-1])))
63+
return
64+
sol()

python/plat3/11408.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
N, M = map(int,input().split())
6+
S,E = 801,802
7+
Total_num = 803
8+
cap = [[0]*Total_num for _ in range(Total_num)]
9+
fl = [[0]*Total_num for _ in range(Total_num)]
10+
d = [[0]*Total_num for _ in range(Total_num)]
11+
adj = [[] for _ in range(Total_num*2+3)]
12+
for i in range(1,N+1):
13+
adj[S].append(i)
14+
adj[i].append(S)
15+
cap[S][i]=1
16+
17+
for i in range(1,M+1):
18+
adj[i+400].append(E)
19+
adj[E].append(i+400)
20+
cap[i+400][E]=1
21+
22+
for i in range(1,N+1):
23+
row = list(map(int,input().split()))
24+
for j in range(1,row[0]+1):
25+
work, cost = row[(j<<1)-1],row[j<<1]
26+
adj[i].append(work+400)
27+
adj[work+400].append(i)
28+
cap[i][work+400]=1
29+
d[i][work+400]+=cost
30+
d[work+400][i]-=cost
31+
32+
def sol():
33+
result = 0
34+
ans = 0
35+
while True:
36+
visited = [-1]*(Total_num)
37+
dist = [1e9]*Total_num
38+
chk = [False]*Total_num
39+
q = deque([S])
40+
dist[S]=0
41+
while q:
42+
n = q.popleft()
43+
chk[n]=False
44+
for nx in adj[n]:
45+
if cap[n][nx]>fl[n][nx] and dist[nx]>dist[n]+d[n][nx]:
46+
dist[nx]=dist[n]+d[n][nx]
47+
visited[nx]=n
48+
if not chk[nx]:
49+
q.append(nx)
50+
chk[nx]=True
51+
if visited[E]==-1:
52+
break
53+
flow = 1e9
54+
now = E
55+
while now!=S:
56+
flow = min(flow,cap[visited[now]][now]-fl[visited[now]][now])
57+
now = visited[now]
58+
now = E
59+
while now!=S:
60+
result += d[visited[now]][now]*flow
61+
fl[visited[now]][now]+=flow
62+
fl[now][visited[now]]-=flow
63+
now = visited[now]
64+
ans+=flow
65+
print(ans)
66+
print(result)
67+
return
68+
sol()

python/plat3/1289.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
M = 1000000007
5+
N = int(input())
6+
sys.setrecursionlimit(100000)
7+
adj = [[] for _ in range(N+1)]
8+
for i in range(N-1):
9+
a,b,cost = map(int,input().split())
10+
adj[a].append((b,cost))
11+
adj[b].append((a,cost))
12+
13+
ans = 0
14+
def dp(idx, p):
15+
global ans, M
16+
ret = 1
17+
for nx,cost in adj[idx]:
18+
if nx==p:continue
19+
tmp = (dp(nx,idx)*cost)%M
20+
ans=(ans+(ret*tmp)%M)%M
21+
ret=(ret+tmp)%M
22+
return ret
23+
24+
dp(1,0)
25+
print(ans)

python/plat3/13511.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import sys
2+
input = sys.stdin.readline
3+
output = sys.stdout.write
4+
5+
N = int(input())
6+
adj = [[] for _ in range(N+1)]
7+
dep = [0]*(N+1)
8+
arr = [[[0,0] for _ in range(21)] for _ in range(N+1)]
9+
for i in range(N-1):
10+
a,b,c = map(int,input().split())
11+
adj[a].append((b,c))
12+
adj[b].append((a,c))
13+
14+
def LCA(x,y):
15+
num = 0
16+
if dep[x]!=dep[y]:
17+
if dep[x]>dep[y]:x,y=y,x
18+
for i in range(20,-1,-1):
19+
if dep[y]-dep[x] >= (1<<i):
20+
num+=arr[y][i][1]
21+
y=arr[y][i][0]
22+
if x==y:return num
23+
for i in range(20,-1,-1):
24+
if arr[x][i][0]!=arr[y][i][0]:
25+
num+=arr[y][i][1]+arr[x][i][1]
26+
x = arr[x][i][0]
27+
y = arr[y][i][0]
28+
return num+arr[x][0][1]+arr[y][0][1]
29+
30+
def LCA2(x,y,k):
31+
if k==0:return x,True
32+
num = 0
33+
if dep[x]!=dep[y]:
34+
if dep[x]>dep[y]:
35+
for i in range(20,-1,-1):
36+
if dep[x]-dep[y]>=(1<<i) and (1<<i)<=k:
37+
x=arr[x][i][0]
38+
k-=1<<i
39+
if k==0:
40+
return x,True
41+
else:
42+
for i in range(20,-1,-1):
43+
if dep[y]-dep[x]>=1<<i:
44+
y=arr[y][i][0]
45+
num+=1<<i
46+
if x==y:
47+
return num-k,False
48+
for i in range(20,-1,-1):
49+
if arr[x][i][0]!=arr[y][i][0] and (1<<i)<=k:
50+
x = arr[x][i][0]
51+
y = arr[y][i][0]
52+
k-=1<<i
53+
num+=1<<i
54+
if k==0:
55+
return x,True
56+
if k==1:
57+
return arr[x][0][0],True
58+
return num-k+2,False
59+
60+
def dfs():
61+
st = [[1,0,0]]
62+
while st:
63+
n, d, p = st.pop()
64+
dep[n]=d
65+
d+=1
66+
for i, cnt in adj[n]:
67+
if i==p:continue
68+
arr[i][0]=[n,cnt]
69+
st.append([i,d,n])
70+
dfs()
71+
72+
for y in range(1,21):
73+
for x in range(1,N+1):
74+
arr[x][y][0] = arr[arr[x][y-1][0]][y-1][0]
75+
arr[x][y][1] += arr[arr[x][y-1][0]][y-1][1]+arr[x][y-1][1]
76+
M = int(input())
77+
for i in range(M):
78+
row = list(map(int,input().split()))
79+
if row[0]==1:
80+
output("%d\n"%LCA(row[1],row[2]))
81+
else:
82+
ans,check = LCA2(row[1],row[2],row[3]-1)
83+
if not check:
84+
ans,check = LCA2(row[2],row[1],ans)
85+
output("%d\n"%ans)

python/plat3/13544.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import sys
2+
import bisect
3+
input = sys.stdin.readline
4+
output = sys.stdout.write
5+
6+
N = int(input())
7+
st = 1
8+
while st<N:
9+
st<<=1
10+
tree = [[] for _ in range(st*2)]
11+
tmp = st
12+
for i,num in enumerate(list(map(int,input().split())),st):
13+
tree[i]=[num]
14+
while tmp>1:
15+
ed = tmp
16+
tmp = tmp>>1
17+
for i in range(tmp,ed):
18+
l,r = 0,0
19+
left,right = len(tree[i<<1]),len(tree[i<<1|1])
20+
while l<left or r<right:
21+
if r==right or l<left and tree[i<<1][l]<tree[i<<1|1][r]:
22+
tree[i].append(tree[i<<1][l])
23+
l+=1
24+
else:
25+
tree[i].append(tree[i<<1|1][r])
26+
r+=1
27+
def query(node,ns,ne,s,e,k):
28+
if ns>e or ne<s: return 0
29+
if s<=ns and ne<=e:
30+
return len(tree[node]) - bisect.bisect_right(tree[node],k)
31+
mid = (ns+ne)>>1
32+
return query(node<<1,ns,mid,s,e,k)+query(node<<1|1,mid+1,ne,s,e,k)
33+
M = int(input())
34+
ans = 0
35+
for i in range(M):
36+
a,b,c = map(int,input().split())
37+
i,j,k = a^ans,b^ans,c^ans
38+
ans = query(1,1,st,i,j,k)
39+
output("%d\n"%ans)

python/plat3/1514.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import sys
2+
input = sys.stdin.readline
3+
sys.setrecursionlimit(100000)
4+
N = int(input())
5+
num1,num2 = [0]*110,[0]*110
6+
for i,num in enumerate(input().strip()):
7+
num1[i]=int(num)
8+
for i,num in enumerate(input().strip()):
9+
num2[i]=int(num)
10+
dp_arr = [[[[[1e9]*2 for l in range(10)] for k in range(10)] for j in range(10)] for i in range(110)]
11+
12+
13+
def dp(now,x,y,z,w):
14+
if now>=N: return 0
15+
if dp_arr[now][x][y][z][w]!=1e9:
16+
return dp_arr[now][x][y][z][w]
17+
if x==num2[now]:
18+
dp_arr[now][x][y][z][w]=min(dp(now+1,y,z,num1[now+3],0),dp(now+1,y,z,num1[now+3],1))
19+
return dp_arr[now][x][y][z][w]
20+
tmp = 1 if w else -1
21+
for i in range(1,4):
22+
i = i*tmp
23+
dp_arr[now][x][y][z][w] = min(dp_arr[now][x][y][z][w],1+dp(now,(x+i)%10,y,z,w))
24+
dp_arr[now][x][y][z][w] = min(dp_arr[now][x][y][z][w],1+dp(now,(x+i)%10,(y+i)%10,z,w))
25+
dp_arr[now][x][y][z][w] = min(dp_arr[now][x][y][z][w],1+dp(now,(x+i)%10,(y+i)%10,(z+i)%10,w))
26+
return dp_arr[now][x][y][z][w]
27+
print(min(dp(0,num1[0],num1[1],num1[2],0),dp(0,num1[0],num1[1],num1[2],1)))

0 commit comments

Comments
 (0)