import sys import queue input = sys.stdin.readline sys.setrecursionlimit(int(1E+7)) dxdy = ((-1,0), (1,0), (0,-1), (0,1)) H, W = map(int,input().split()) maze = [] visited = [ [0]*W for _ in range(H)] black = 0 for h in range(H): s = input() maze.append(s) for c in s: if c=='#': black += 1 q = queue.Queue() q.put((0,0,0)) cost = -1 while(not q.empty()): y, x, d = q.get() if x == W-1and y == H-1: cost = d break if visited[y][x] == 1: continue else: visited[y][x] = 1 for dx, dy in dxdy: if (0<= x+dx < W) and (0<= y+dy < H): if visited[y+dy][x+dx] == 0and maze[y+dy][x+dx]=='.': q.put((y+dy,x+dx,d+1)) if cost==-1: print (-1) else: print (H*W-cost-1-black)
import sys input = sys.stdin.readline sys.setrecursionlimit(int(1E+7)) defmain(): N, Q = map(int, input().split()) link = [[] for _ in range(N+1)] for n in range(N-1): a, b = map(int, input().split()) link[a].append(b) link[b].append(a) V = [0] * (N+1) for q in range(Q): p, x = map(int, input().split()) V[p] += x # `操作`の際の根に当たるノードのカウンター`V`に先に値を加算する。
defdfs(i, parent, acc):# 深さ優先探索 V[i] += acc # 親ノードまでの累積値を加算 for j in link[i]: if j != parent: # 親ノードを追加しない dfs(j,i,V[i]) cur = 1 parent = 0 acc = 0 dfs(cur, parent , acc) # 親ノードを0としてスタート V = [str(v) for v in V] print (" ".join(V[1:]))
for comb in combinations(range(3),2): print (comb)
1 2 3
(0, 1) (0, 2) (1, 2)
コード
それでは実装にうつりましょう。
知り合いであるかどうかをlinkを使って表します。
1 2 3 4 5 6 7
from itertools import combinations N, M = map(int, input().split()) link = [[0for i in range(N)] for j in range(N)] for m in range(M): x, y = map(int, input().split()) link[x-1][y-1] = 1 link[y-1][x-1] = 1
続いて、議員の集合として考えられる組み合わせを列挙します。
最大の派閥に属する議員数を求めたいので、議員数が多くなるような集合から先に考えます。
1 2 3
ans = 1 for i in range(N,1,-1): # N, N-1, N-2, ... 2 for comb in combinations(range(N),i):
議員の集合に対して考えられるペアを列挙し、知り合いかどうかをチェックします。
一つでも知り合いでない組があれば、その集合は派閥にはなり得ません。
ここで、またcombinationsが有効です。
1 2 3 4 5 6
for c in combinations(comb, 2): # 議員の集合に対して考えられるペアを列挙 if (link[c[0]][c[1]] == 0): # 一つでも知り合いでない組があればNG break else: # 派閥が作れた段階でプログラムを終了 print (i) exit()
最後にコード全体を載せておきます。
コード(全体)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from itertools import combinations N, M = map(int, input().split()) link = [[0for i in range(N)] for j in range(N)] for m in range(M): x, y = map(int, input().split()) link[x-1][y-1] = 1 link[y-1][x-1] = 1
for i in range(N,1,-1): # N, N-1, N-2, ... 2 for comb in combinations(range(N),i): for c in combinations(comb, 2): # 議員の集合に対して考えられるペアを列挙 if (link[c[0]][c[1]] == 0): # 一つでも知り合いでない組があればNG break else: # 派閥が作れた段階でプログラムを終了 print (i) exit() print (1)
from math import gcd K = int(input()) ans = 0 for i in range(1,K+1): for j in range(1,K+1): gcd_ij = gcd(i, j) for k in range(1,K+1): ans += gcd(gcd_ij, k) print (ans)
N = int(input()) S = input() ans = S.count('R') * S.count('G') * S.count('B') # 一つ目の条件
for i in range(N): for j in range(1,N): # 1から if (i-j<0or i+j>=N): # リストの範囲内かを確認 break l = S[i-j] m = S[i] r = S[i+j] if l!=m and m!=r and r!=l: # 二つ目の条件 ans -= 1 print (ans)
MOD = int(1e+9 + 7) # 忘れずにintをつける N, K = map(int, input().split()) cnt = [0] * (K + 1) # 後々のことを考え、サイズをK+1にする for x in range(1, K + 1): # 先頭0は使わない cnt[x] = pow(K // x, N, MOD) # 要素が全てXの倍数となるような数列の個数をXごとに求める for x in range(K, 0, -1): # 大きい順に計算 for i in range(2, K // x + 1): # 2X, 3Xの個数を求めてひく cnt[x] -= cnt[x * i]
ans = 0 for k in range(K+1): ans += cnt[k] * k # gcdがkである組はA[k]個ある ans = ans % MOD # ここでもMODをつける print(ans)
ちょっとプリントデバッグを仕込んでみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
MOD = int(1e+9 + 7) # 忘れずにintをつける N, K = map(int, input().split()) cnt = [0] * (K + 1) # 後々のことを考え、サイズをK+1にする for x in range(1, K + 1): # 先頭0は使わない cnt[x] = pow(K // x, N, MOD) # 要素が全てXの倍数となるような数列の個数をXごとに求める print (cnt)
for x in range(K, 0, -1): # 大きい順に計算 for i in range(2, K // x + 1): # 2X, 3Xの個数を求めてひく cnt[x] -= cnt[x * i] print (cnt)
ans = 0 for k in range(K+1): ans += cnt[k] * k # gcdがkである組はA[k]個ある ans = ans % MOD # ここでもMODをつける print(ans)
defis_ok(x): ls = [] for i in range(N): ls.append((x-H[i])//S[i]) # いつまでに割れば良いか ls.sort() # 期限が近いものから先にわる for n in range(N): if (ls[n] < n): returnFalse# 時間ぎれ returnTrue
defmeguru_bisect(ng, ok): while (abs(ok - ng) > 1): mid = (ok + ng) // 2 if is_ok(mid): ok = mid else: ng = mid return ok
N = int(input()) H = [] S = [] for i in range(N): h, s = map(int,input().split()) H.append(h) S.append(s) print (meguru_bisect(0,int(1e+14)))
import bisect N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) C = list(map(int, input().split())) A.sort() B.sort() C.sort() ans = 0 for b in B: a = bisect.bisect_left(A, b) # 挿入点はどの同じ値よりも左 c = bisect.bisect_right(C, b) # 挿入点はどの同じ値よりも右 ans += a * (len(C)-c) print (ans)