題意
給定 4 4 4 個範圍在 1 1 1 到 4 4 4 的整數,分別代表 4 4 4 個球的顏色。每次操作可以選擇兩個顏色相同的球並將它們丟棄,給出可以執行操作的最大次數。
思路:計數(Counting)
統計每個顏色出現的次數 c n t [ i ] cnt[i] c n t [ i ] ,對於每個顏色,將其出現的次數除以 2 2 2 ,取整數部分,最後將所有顏色的對數相加。
複雜度分析
時間複雜度:O ( n ) \mathcal{O}(n) O ( n ) ,其中 n n n 為球的數量,本題中 n = 4 n = 4 n = 4 。
空間複雜度:O ( m ) \mathcal{O}(m) O ( m ) ,其中 m m m 為球的顏色種類數量,本題中 m = 4 m = 4 m = 4 。
1 2 3 4 5 A = list (map (int , input ().split())) cnt = [0 ] * (5 ) for x in A: cnt[x] += 1 print (sum (x // 2 for x in cnt))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <bits/stdc++.h> using namespace std;const int N = 4 ;#define endl '\n' int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); vector<int > A (N) , cnt (N + 1 ) ; for (int i = 0 ; i < N; i++) { cin >> A[i]; cnt[A[i]]++; } int ans = 0 ; for (auto &x : cnt) { ans += x / 2 ; } cout << ans << endl; return 0 ; }
題意
給定 N N N 種垃圾的收取規則,其中第 i i i 種垃圾會在第 d i d_i d i 天收取,其中 d i d_i d i 滿足 d i m o d q i = r i d_i \bmod q_i = r_i d i mod q i = r i 。
回答 Q Q Q 個查詢,每個查詢給定第 t j t_j t j 種垃圾在第 d j d_j d j 天被放出,回答它將在第幾天被收取。
若垃圾在丟棄當天同時也是該種垃圾的收取日,則當天就會被收取。
思路:模運算(Modular Arithmetic)
對於每個查詢 ( t j , d j ) (t_j, d_j) ( t j , d j ) ,根據垃圾種類 t j t_j t j 對應的 q i q_i q i 和 r i r_i r i ,我們需要找到最早的大於或等於丟棄日期 d j d_j d j 的日期 d a n s d_{ans} d an s ,使得 d a n s m o d q i = r i d_{ans} \bmod q_i = r_i d an s mod q i = r i 。
首先計算 r = d j m o d q i r = d_j \bmod q_i r = d j mod q i ,如果 r = r i r = r_i r = r i ,則當天就會被收取,答案即為 d j d_j d j 。
否則需要計算下一個滿足 d m o d q i = r i d \bmod q_i = r_i d mod q i = r i 的日期,這可以通過計算 ( r i − d j ) m o d q i (r_i - d_j) \bmod q_i ( r i − d j ) mod q i ,然後將結果加到 d j d_j d j 上得到。
如果 r i > d j m o d q i r_i > d_j \bmod q_i r i > d j mod q i ,則直接得到需要增加的天數。
如果 r i < d j m o d q i r_i < d_j \bmod q_i r i < d j mod q i ,則會借一個完整的週期( q i q_i q i ),確保結果為正數。
但需要確保取模後的結果為正數,所以在 C++ 中需要對結果進行修正,即 ( ( r i − d j ) m o d q i + q i ) m o d q i ((r_i - d_j) \bmod q_i + q_i) \bmod q_i (( r i − d j ) mod q i + q i ) mod q i 。
複雜度分析
時間複雜度:O ( N + Q ) \mathcal{O}(N + Q) O ( N + Q ) ,其中 N N N 為垃圾種類數量,Q Q Q 為查詢數量。
空間複雜度:O ( N ) \mathcal{O}(N) O ( N ) ,用於儲存垃圾種類規則。
1 2 3 4 5 6 7 8 9 10 11 N = int (input ()) garbages = [tuple (map (int , input ().split())) for _ in range (N)] Q = int (input ()) for _ in range (Q): t_j, d_j = map (int , input ().split()) q_i, r_i = garbages[t_j - 1 ] if d_j % q_i == r_i: ans = d_j else : ans = d_j + ((r_i - d_j) % q_i) print (ans)
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 #include <bits/stdc++.h> using namespace std;#define endl '\n' int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); int N, Q, q_i, r_i, t_j, d_j; cin >> N; vector<pair<int , int >> garbages (N); for (int i = 0 ; i < N; i++) { cin >> garbages[i].first >> garbages[i].second; } cin >> Q; for (int i = 0 ; i < Q; i++) { cin >> t_j >> d_j; q_i = garbages[t_j - 1 ].first; r_i = garbages[t_j - 1 ].second; if (d_j % q_i == r_i) { cout << d_j << endl; } else { cout << d_j + ((r_i - d_j) % q_i + q_i) % q_i << endl; } } return 0 ; }
題意
給定一個由 N N N 個正數組成的陣列 A A A = ( A 1 , A 2 , … , A N ) (A_1, A_2, \dots, A_N) ( A 1 , A 2 , … , A N ) ,構造相同長度的序列 B B B = ( B 1 , B 2 , … , B N ) (B_1, B_2, \dots, B_N) ( B 1 , B 2 , … , B N ) ,滿足 B i B_i B i 為 A i A_i A i 上一次出現的位置,如果不存在這樣的位置,則令 B i = − 1 B_i = -1 B i = − 1 。
思路:雜湊表(Hash Table)
使用一個雜湊表 p o s pos p os 紀錄每個數字最後出現的位置,遍歷陣列 A A A ,對於每個 A i A_i A i ,如果 A i A_i A i 已經出現過,則 B i = p o s [ A i ] B_i = pos[A_i] B i = p os [ A i ] ,否則 B i = − 1 B_i = -1 B i = − 1 。最後更新 p o s [ A i ] pos[A_i] p os [ A i ] 為當前位置。
複雜度分析
時間複雜度:O ( N ) \mathcal{O}(N) O ( N )
空間複雜度:O ( N ) \mathcal{O}(N) O ( N )
1 2 3 4 5 6 7 8 9 10 11 12 from collections import defaultdictN = int (input ()) A = list (map (int , input ().split())) ans = [-1 ] * N pos = defaultdict(lambda : -1 ) for i, x in enumerate (A): ans[i] = pos[x] pos[x] = i + 1 print (*ans)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <bits/stdc++.h> using namespace std;#define endl '\n' int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); int N, x; cin >> N; unordered_map<int , int > pos; vector<int > ans (N, -1 ) ; for (int i = 0 ; i < N; i++) { cin >> x; ans[i] = (pos.find (x) == pos.end () ? -1 : pos[x]); pos[x] = i + 1 ; } for (int i = 0 ; i < N; i++) { cout << ans[i] << ' ' ; } cout << endl; return 0 ; }
題意
給定一個大小為 H × W H \times W H × W 的網格,其中 S i , j S_{i,j} S i , j 表示位於從上至下第 i i i 行、從左至右第 j j j 列的格子,若 S i , j S_{i,j} S i , j 為 .
表示空地,S i , j S_{i,j} S i , j 為 #
表示阻塞的格子。
另給定一個正整數 K K K ,計算從一個空地開始,進行 K K K 步移動到相鄰的格子的方式數量(可以向上、向下、向左或向右移動),且不經過阻塞的格子,也不重複拜訪同一個格子。
約束條件
1 ≤ H , W ≤ 10 1 \leq H, W \leq 10 1 ≤ H , W ≤ 10
1 ≤ K ≤ 11 1 \leq K \leq 11 1 ≤ K ≤ 11
H H H 、W W W 和 K K K 為整數。
每個 S i , j S_{i,j} S i , j 皆為 .
或 #
。
至少有一個格子為空地。
思路:回溯(Backtracking)
注意到 K K K 最多只有 11 11 11 ,因此可以考慮使用 回溯(Backtracking) 進行暴力搜索,對於每個空地格子 ( i , j ) (i, j) ( i , j ) ,以它為起點進行深度優先搜索,嘗試所有可能的路徑,並計算合法的路徑數量。
在回溯的過程中需要記錄已經拜訪過的格子,以避免重複拜訪,可以使用一個二維陣列 v i s i t e d visited v i s i t e d 來記錄每個格子是否被拜訪過、或是直接修改網格 S S S 的值,並且在回溯時需要恢復狀態。
複雜度分析
時間複雜度:O ( H × W × 4 × 3 K − 1 ) \mathcal{O}(H \times W \times 4 \times 3^{K-1}) O ( H × W × 4 × 3 K − 1 )
最多有 H × W H \times W H × W 個可能的起點,每個起點最多有 4 4 4 個方向可以走,由於不能走回頭路,所以之後的每一步最多有 3 3 3 個方向可以走。
空間複雜度:O ( H × W ) \mathcal{O}(H \times W) O ( H × W )
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 import syssys.setrecursionlimit(10 ** 6 ) H, W, K = map (int , input ().split()) grid = [input ().strip() for _ in range (H)] DIR = [(-1 ,0 ), (1 ,0 ), (0 ,-1 ), (0 ,1 )] ans = 0 visited = [[False for _ in range (W)] for _ in range (H)] def dfs (x, y, step ): global ans if step == K: ans += 1 return for dx, dy in DIR: nx, ny = x + dx, y + dy if 0 <= nx < H and 0 <= ny < W: if grid[nx][ny] == '.' and not visited[nx][ny]: visited[nx][ny] = True dfs(nx, ny, step + 1 ) visited[nx][ny] = False for i in range (H): for j in range (W): if grid[i][j] == '.' : visited[i][j] = True dfs(i, j, 0 ) visited[i][j] = False print (ans)
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 #include <bits/stdc++.h> using namespace std;#define endl '\n' int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); vector<pair<int , int >> DIR = {{-1 , 0 }, {1 , 0 }, {0 , -1 }, {0 , 1 }}; int H, W, K; cin >> H >> W >> K; vector<string> grid (H) ; for (int i = 0 ; i < H; i++) { cin >> grid[i]; } int ans = 0 ; auto dfs = [&](auto &&dfs, int x, int y, int step) -> void { if (step == K) { ans += 1 ; return ; } for (auto [dx, dy] : DIR) { int nx = x + dx, ny = y + dy; if (nx >= 0 && nx < H && ny >= 0 && ny < W && grid[nx][ny] == '.' ) { grid[nx][ny] = '#' ; dfs (dfs, nx, ny, step + 1 ); grid[nx][ny] = '.' ; } } }; for (int i = 0 ; i < H; i++) { for (int j = 0 ; j < W; j++) { if (grid[i][j] == '.' ) { grid[i][j] = '#' ; dfs (dfs, i, j, 0 ); grid[i][j] = '.' ; } } } cout << ans << endl; return 0 ; }
題意
給定一個長度為 N N N 的非負整數陣列 A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \dots, A_N) A = ( A 1 , A 2 , … , A N ) ,以及一個正整數 M M M ,計算以下值:
∑ 1 ≤ l ≤ r ≤ N ( ( ∑ l ≤ i ≤ r A i ) m o d M ) . \sum_{1 \leq l \leq r \leq N} \left( \left(\sum_{l \leq i \leq r} A_i\right) \mathbin{\mathrm{mod}} M \right).
1 ≤ l ≤ r ≤ N ∑ ( ( l ≤ i ≤ r ∑ A i ) mod M ) .
其中,X m o d M X \mathbin{\mathrm{mod}} M X mod M 表示非負整數 X X X 除以 M M M 後的餘數。
約束條件
1 ≤ N ≤ 2 × 1 0 5 1 \leq N \leq 2 \times 10^5 1 ≤ N ≤ 2 × 1 0 5
1 ≤ M ≤ 2 × 1 0 5 1 \leq M \leq 2 \times 10^5 1 ≤ M ≤ 2 × 1 0 5
0 ≤ A i ≤ 1 0 9 0 \leq A_i \leq 10^9 0 ≤ A i ≤ 1 0 9
思路:統計貢獻 + 樹狀陣列 + 逆序對
首先從沒有取模的狀況開始,即計算所有區間和的總和:
∑ 1 ≤ l ≤ r ≤ N ( ∑ l ≤ i ≤ r A i ) \sum_{1 \leq l \leq r \leq N} \left(\sum_{l \leq i \leq r} A_i\right)
1 ≤ l ≤ r ≤ N ∑ ( l ≤ i ≤ r ∑ A i )
我們可以考慮以 r r r 為右端點的區間的貢獻,即:
( ∑ 1 ≤ i ≤ r A i ) + ( ∑ 2 ≤ i ≤ r A i ) + ⋯ + ( ∑ r ≤ i ≤ r A i ) = ∑ 1 ≤ l ≤ r ( ∑ l ≤ i ≤ r A i ) \left(\sum_{1 \leq i \leq r} A_i\right) + \left(\sum_{2 \leq i \leq r} A_i\right) + \cdots + \left(\sum_{r \leq i \leq r} A_i\right) = \sum_{1 \leq l \leq r} \left(\sum_{l \leq i \leq r} A_i\right)
( 1 ≤ i ≤ r ∑ A i ) + ( 2 ≤ i ≤ r ∑ A i ) + ⋯ + ( r ≤ i ≤ r ∑ A i ) = 1 ≤ l ≤ r ∑ ( l ≤ i ≤ r ∑ A i )
令 s [ r ] s[r] s [ r ] 為前 r r r 項的前綴和,則上述和可以表示為:
∑ 1 ≤ l ≤ r s [ r ] − s [ l − 1 ] \sum_{1 \leq l \leq r} s[r] - s[l-1]
1 ≤ l ≤ r ∑ s [ r ] − s [ l − 1 ]
展開後為:
( s [ r ] − s [ 0 ] ) + ( s [ r ] − s [ 1 ] ) + ⋯ + ( s [ r ] − s [ r − 1 ] ) = s [ r ] × r − ∑ 0 ≤ l ≤ r − 1 s [ l ] (s[r] - s[0]) + (s[r] - s[1]) + \cdots + (s[r] - s[r-1]) = s[r] \times r - \sum_{0 \leq l \leq r-1} s[l]
( s [ r ] − s [ 0 ]) + ( s [ r ] − s [ 1 ]) + ⋯ + ( s [ r ] − s [ r − 1 ]) = s [ r ] × r − 0 ≤ l ≤ r − 1 ∑ s [ l ]
因此,我們可以在遍歷 r r r 的過程中,先透過前綴和 s s s 計算 s [ r ] × r s[r] \times r s [ r ] × r ,接著計算以 r r r 為右端點的區間的貢獻 s [ r ] × r − ∑ 0 ≤ l ≤ r − 1 s [ l ] s[r] \times r - \displaystyle\sum_{0 \leq l \leq r-1} s[l] s [ r ] × r − 0 ≤ l ≤ r − 1 ∑ s [ l ] ,最後維護 ∑ 0 ≤ l ≤ r − 1 s [ l ] \displaystyle\sum_{0 \leq l \leq r-1} s[l] 0 ≤ l ≤ r − 1 ∑ s [ l ] ,這只要加上 s [ r ] s[r] s [ r ] 即可。
至此,我們已經可以解決沒有取模的狀況。接著考慮取模後的情況:
( ∑ l ≤ i ≤ r A i ) m o d M = ( s [ r ] − s [ l − 1 ] ) m o d M = ( s [ r ] m o d M ) − ( s [ l − 1 ] m o d M ) m o d M \begin{align*}
\left(\sum_{l \leq i \leq r} A_i\right) \bmod M
&= \left( s[r] - s[l-1] \right) \bmod M \\
&= (s[r] \bmod M) - (s[l-1] \bmod M) \bmod M
\end{align*}
( l ≤ i ≤ r ∑ A i ) mod M = ( s [ r ] − s [ l − 1 ] ) mod M = ( s [ r ] mod M ) − ( s [ l − 1 ] mod M ) mod M
我們可以在計算前綴和的過程中對 s [ i ] s[i] s [ i ] 取模,並且在計算答案時考慮取模後的值,但由於取模後 s [ r ] m o d M s[r] \bmod M s [ r ] mod M 不一定會大於 s [ l − 1 ] m o d M s[l-1] \bmod M s [ l − 1 ] mod M ,因此需要考慮兩種情況:
若 s [ r ] m o d M ≥ s [ l − 1 ] m o d M s[r] \bmod M \geq s[l-1] \bmod M s [ r ] mod M ≥ s [ l − 1 ] mod M ,則對答案的貢獻還是 s [ r ] m o d M − s [ l − 1 ] m o d M s[r] \bmod M - s[l-1] \bmod M s [ r ] mod M − s [ l − 1 ] mod M 。
若 s [ r ] m o d M < s [ l − 1 ] m o d M s[r] \bmod M < s[l-1] \bmod M s [ r ] mod M < s [ l − 1 ] mod M ,則對答案的貢獻為 s [ r ] m o d M − s [ l − 1 ] m o d M + M s[r] \bmod M - s[l-1] \bmod M + M s [ r ] mod M − s [ l − 1 ] mod M + M ,即需要補加 M M M 。
因此,我們在計算以 r r r 為右端點的區間的貢獻時,需要計算有多少個 l l l 滿足 s [ r ] m o d M < s [ l − 1 ] m o d M s[r] \bmod M < s[l-1] \bmod M s [ r ] mod M < s [ l − 1 ] mod M ,即 逆序對(Reverse Pair) 的數量,這可以使用 樹狀陣列(Fenwick Tree / Binary Indexed Tree, BIT) 在 O ( log M ) O(\log M) O ( log M ) 的時間內完成。這裡直接使用 AtCoder Library 的樹狀陣列。
這裡 l l l 的下標寫的不太統一,寫 s [ l − 1 ] s[l - 1] s [ l − 1 ] 的時候 l l l 的範圍是 1 ≤ l ≤ r 1 \leq l \leq r 1 ≤ l ≤ r ,寫 s [ l ] s[l] s [ l ] 的時候 l l l 的範圍是 0 ≤ l ≤ r − 1 0 \leq l \leq r-1 0 ≤ l ≤ r − 1 。
複雜度分析
時間複雜度:O ( N log M ) \mathcal{O}(N \log M) O ( N log M )
空間複雜度:O ( N + M ) \mathcal{O}(N + M) O ( N + M )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from atcoder.fenwicktree import FenwickTreeN, M = map (int , input ().split()) A = list (map (int , input ().split())) s = [0 ] * (N + 1 ) for i, x in enumerate (A): s[i+1 ] = (s[i] + x) % M bit = FenwickTree(M) bit.add(0 , 1 ) ans = 0 s_sl = 0 for r in range (1 , N+1 ): ans += s[r] * r - s_sl ans += M * (r - bit.sum (0 , s[r] + 1 )) bit.add(s[r], 1 ) s_sl += s[r] print (ans)
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 #include <bits/stdc++.h> #include <atcoder/fenwicktree> using namespace std;using namespace atcoder;using LL = long long ;#define endl '\n' int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); int N, M; cin >> N >> M; vector<int > A (N) ; vector<LL> s (N + 1 ) ; for (int i = 0 ; i < N; i++) { cin >> A[i]; s[i + 1 ] = (s[i] + A[i]) % M; } fenwick_tree<LL> bit (M) ; bit.add (0 , 1 ); LL ans = 0 , s_sl= 0 ; for (int r = 1 ; r <= N; r++) { ans += s[r] * r - s_sl; ans += M * (r - bit.sum (0 , s[r] + 1 )); bit.add (s[r], 1 ); s_sl += s[r]; } cout << ans << endl; return 0 ; }
題意
給定一棵包含 N N N 個頂點的樹,並給定 N − 1 N-1 N − 1 條邊,第 i i i 條邊連接頂點 u i u_i u i 和 v i v_i v i 。
在給定的樹中添加一條無向邊,總是會產生一個包含恰好一個環的圖。
在這樣的圖中,有多少滿足以下所有條件?
該圖是 簡單圖 。
環中的所有頂點的度數均為 3 3 3 。
約束條件
3 ≤ N ≤ 2 × 1 0 5 3 \leq N \leq 2 \times 10^5 3 ≤ N ≤ 2 × 1 0 5
1 ≤ u i , v i ≤ N 1 \leq u_i, v_i \leq N 1 ≤ u i , v i ≤ N
思路:DFS / BFS
由於在加入一條邊後,環中的所有頂點的度數均為 3 3 3 ,因此這個環必定是由 2 2 2 個度數為 2 2 2 的頂點和若干個度數為 3 3 3 的頂點組成。
因此,我們只需要找到一個所有頂點的度數均為 3 3 3 的連通分量,並計算與這個連通分量相鄰的度數為 2 2 2 的頂點數量 c n t cnt c n t ,在這些度數為 2 2 2 的頂點中任選兩個配對,便能產生一個符合條件的圖,故可以得該連通分量對答案的貢獻為 c n t × ( c n t − 1 ) 2 \frac{cnt \times (cnt - 1)}{2} 2 c n t × ( c n t − 1 ) 。
得到上述結論後,我們只需要對樹進行 DFS 或 BFS,找到每個度數均為 3 3 3 的連通分量中,度數為 2 2 2 的頂點數量,並計算貢獻即可。
為了確保每個連通分量只會被計算一次,需要記錄每個頂點是否被訪問過。
複雜度分析
時間複雜度:O ( N ) \mathcal{O}(N) O ( N )
空間複雜度:O ( N ) \mathcal{O}(N) O ( N )
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 import syssys.setrecursionlimit(10 **6 ) N = int (input ()) edges = [list (map (int , input ().split())) for _ in range (N-1 )] g = [[] for _ in range (N + 1 )] deg = [0 ] * (N + 1 ) for u, v in edges: g[u].append(v) g[v].append(u) deg[u] += 1 deg[v] += 1 vis = [False ] * (N + 1 ) def dfs (u ): if deg[u] != 3 or vis[u]: return 0 vis[u] = True cnt = 0 for v in g[u]: if deg[v] == 2 : cnt += 1 elif deg[v] == 3 and not vis[v]: cnt += dfs(v) return cnt ans = 0 for x in range (1 , N + 1 ): if deg[x] != 3 or vis[x]: continue cnt = dfs(x) ans += cnt * (cnt - 1 ) // 2 print (ans)
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 #include <bits/stdc++.h> using namespace std;using LL = long long ;#define endl '\n' int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); int N; cin >> N; vector<pair<int , int >> edges (N - 1 ); for (int i = 0 ; i < N - 1 ; i++) { cin >> edges[i].first >> edges[i].second; } vector<vector<int >> g (N + 1 ); vector<int > deg (N + 1 ) ; for (auto [u, v] : edges) { g[u].push_back (v); g[v].push_back (u); deg[u] += 1 ; deg[v] += 1 ; } vector<bool > vis (N + 1 ) ; auto dfs = [&](auto dfs, int u) -> int { if (deg[u] != 3 || vis[u]) return 0 ; vis[u] = true ; int cnt = 0 ; for (int v : g[u]) { if (deg[v] == 2 ) cnt += 1 ; else if (deg[v] == 3 && !vis[v]) cnt += dfs (dfs, v); } return cnt; }; LL ans = 0 ; for (int i = 1 ; i <= N; i++) { if (deg[i] != 3 || vis[i]) continue ; int cnt = dfs (dfs, i); ans += cnt * (cnt - 1LL ) / 2 ; } cout << ans << endl; return 0 ; }
寫在最後
PROMPT 1girl, solo, long hair, looking at viewer, bangs, hair ornament, dress, hair between eyes, bare shoulders, jewelry, sitting, closed mouth, green eyes, white hair, short sleeves, sidelocks, multicolored hair, outdoors, detached sleeves, green hair, sleeveless, pointy ears, white dress, side ponytail, bracelet, tree, symbol-shaped pupils, gradient hair, white footwear, bug, white socks, butterfly, leaf hair ornament, toeless footwear, cross-shaped pupils, in tree, swing, nahida (genshin impact),