for _ inrange(T): N = int(input()) A = list(map(int, input().split()))
ans = 0 cnt = defaultdict(int) cnt[1] = cnt[2] = 0# 不加這行會 TLE
for val in A: ans += cnt[val] # ai = aj if val == 1: # ai = 2, aj = 1 ans += cnt[2] elif val == 2: # ai = 1, aj = 2 ans += cnt[1] cnt[val] += 1 print(f"{ans}\n")
for _ inrange(T): N = int(input()) A = list(map(int, input().split()))
min_val = float("inf") min_idx = -1 for idx, num inenumerate(A): if num < min_val: min_val = num min_idx = idx flag = False# 最小元素後是否有遞減的情況 for i inrange(min_idx + 1, N): if A[i - 1] > A[i]: # 出現遞減的情況 flag = True break if flag: print(-1) else: print(min_idx)
有 n 個頂點,可以以任意方式構造成一棵樹,接下來有 d 個數,表示共有 d 輪。每一輪可以選擇一個已有的邊將其刪除,然後再連一邊形成一顆新的樹,要求每一輪都有兩個葉子節點的距離恰好為 di 。
輸出 n−1 條邊表示樹的構造,和每輪的操作方式。答案不唯一,只要符合條件即可
思路
創造一條有 n 個點的Path(鏈),再每一輪中,我們固定第一個點和最後一個點的距離為我們要的 di ,因此每次操作都是把最後一個點移動到某個點上
以範例的第2個測資為例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
T = int(input())
for _ inrange(T): N, Q = map(int, input().split()) D = [int(input()) for _ inrange(Q)] # print edges for i inrange(1, N): print(i, i + 1) # print operation last = N - 1# 上次移動到哪個點上 for d in D: if last == d: print(-1, -1, -1) else: print(N, last, d) last = d