Skip to content
This repository has been archived by the owner on Sep 5, 2024. It is now read-only.

Commit

Permalink
fix: addressed review v1
Browse files Browse the repository at this point in the history
  • Loading branch information
thirofoo committed Aug 4, 2024
1 parent a9c8c21 commit 9b60ebd
Showing 1 changed file with 20 additions and 21 deletions.
41 changes: 20 additions & 21 deletions loneliness/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@

## 問題文

数直線上に $1, 2, ..., 60$ の番号が付けられた人がいます\
$i$ の番号が付けられた人を人 $i$ と呼びます\
番号が同じ人は 2 人で 1 つのペアを組むことができます。<br>
数直線上に人がいます\
それぞれの人は $1, 2, ... , 60$ のクラスのうち 1 つに属しています\
同じクラスの人は 2 人で 1 つのペアを組むことができます。<br>

$Q$ 個のクエリが与えられるので順に処理してください。各クエリは次の
2 種類のどちらかです。

- `1 L R l r`:区間 $\lbrack L, R \rparen$ 内に人 $l, l+1, ... , r$ がそれぞれ奇数人、それ以外の人は偶数人いるという情報が与えられる
- `1 L R l r`:区間 $\lbrack L, R \rparen$ 内にクラス $l, l+1, ... , r$ の人がそれぞれ奇数人、それ以外のクラスの人は偶数人いるという情報が与えられる
- `2 L R`:区間 $\lbrack L, R \rparen$ にいる人で可能な限りペアを組んだ場合に、ペアになれずに残る人数を出力する。質問の時点で答えが一通りに定まらない場合は、代わりに `Ambiguous` と出力する。

なお、各人は複数の区間にまたがることはないものとします。
Expand Down Expand Up @@ -71,9 +71,9 @@ Ambiguous
0
```

1 つ目のクエリでは、区間 $\lbrack 1, 3 \rparen$ には人 2 が奇数人、それ以外の人 1, 3 が偶数人いるという情報が得られます。<br>
3 つ目のクエリでは、区間 $\lbrack 1, 2 \rparen$ には人 1 が奇数人、それ以外の人 2, 3 が偶数人存在するという情報が得られます。<br>
5 つ目のクエリでは、区間 $\lbrack 2, 3 \rparen$ に人 1, 2, 3 はそれぞれ奇数, 奇数, 偶数人存在することが分かるので、ペアになれずに残る人は 2 人です。
1 つ目のクエリでは、区間 $\lbrack 1, 3 \rparen$ にはクラス 2 の人が奇数人、それ以外のクラス 1, 3 の人が偶数人いるという情報が得られます。<br>
3 つ目のクエリでは、区間 $\lbrack 1, 2 \rparen$ にはクラス 1 の人が奇数人、それ以外のクラス 2, 3 の人が偶数人存在するという情報が得られます。<br>
5 つ目のクエリでは、区間 $\lbrack 2, 3 \rparen$ にクラス 1, 2, 3 の人はそれぞれ奇数, 奇数, 偶数人存在することが分かるので、ペアになれずに残る人は 2 人です。

なお、この入力例は小課題 1, 2 の制約を満たします。

Expand Down Expand Up @@ -116,24 +116,23 @@ Ambiguous

### 部分点 1 解法

まず、今回はクエリで現れる区間の長さは特に考慮しないため、クエリを先読みして座標圧縮をしても問題ありません。
また、クエリの数が $Q$ 個という情報より、地点として現れる座標の数は $2Q$ 個以下であることが保証されます。
まず、今回はクエリで現れる区間の長さは特に考慮しないため、クエリを先読みして座標圧縮をしても問題ありません。<br>

ここで二つの区間 $\lbrack L_1, R_1 \rparen, \lbrack L_2, R_2 \rparen$ を考えます。($L_1 < L_2 < R_1 < R_2$ とする。)<br>
また、$\lbrack L_1, R_1 \rparen$ には人 $l_1, l_1 + 1, ... , r_1$ が、$\lbrack L_2, R_2 \rparen$ には人 $l_2, l_2 + 1, ... , r_2$ が奇数人いるとし、それ以外に偶数人いるとします。
また、ある区間 $\lbrack L , R \rparen$ において、各クラスでペアを作れずに余る人は 0 or 1 人しかいません。即ち、答えはある区間 $\lbrack L , R \rparen$ における各クラスの人数の mod 2 の総和に等しいです。<br>

すると、二つの区間が重なった区間 $\lbrack L_2, R_1 \rparen$ は、奇数 + 奇数 = 偶数人存在することが分かります。<br>
これは和の mod 2 の演算をしていることに等しいため、XOR 演算を用いて区間の情報を管理することができます。
ここで $B_{L,R}$ 以下を定義します。

よって、クエリ 1 では L, R にコスト $\sum_{i=1}^{60} 2^{i-1}\times$ (人 $i$ の人数 $\% 2$) の辺を張り、クエリ 2 では移動時に XOR を行うようにして L から R へ BFS を行うことで、 $O(Q^2)$ で解くことができます。
$$B_{L,R} = \sum_{i=1}^{60} 2^{i-1}\times (区間 \ \lbrack L , R \rparen \ にいるクラス \ i \ の人数 \ \text{mod 2})$$

### 満点解法
これは、 $(B_{L,R} \ \& \ (1 << i)) \neq 0$ の時、区間 $\lbrack L , R \rparen$ にクラス $i$ の人が奇数人存在することを意味する値です。

$L < M < R$ において、 $B_{L,M} \oplus B_{M,R}$ を考えると、これは各桁が 2 進数における mod 2 の和に等しいため、 $B_{L,R}$ に等しいです。これはある $\lbrack L , R \rparen$ における答えは、$\lbrack L , M \rparen$ と $\lbrack M , R \rparen$ から求められることを意味します。<br>

満点解法に用いる事実として、以下があります。<br>
以下では、$\lbrack L, R \rparen$ におけるコストを $C_{L,R}$ とし、 $C_{L,R} = \sum_{i=1}^{60} 2^{i-1}\times$ (人 $i$ の人数 $\% 2$) とします。
これにより、クエリ 1 の $L, R$ 間にコスト $B_{L,R}$ の辺を張ったグラフを考え、クエリ 2 における $L$ を始点として移動時にコストで XOR を取るような BFS を行うことで、$R$ に到着した時のコストがクエリ 2 の答えになります。<br>

- $P_1 < P_2 < P_3$ として、 $C_{P_1,P_3} = C_{P_1,P_2} \oplus C_{P_2,P_3}$
- XOR より $C_{P_1,P_2} = C_{P_1,P_3} \oplus C_{P_2,P_3}, C_{P_2,P_3} = C_{P_1,P_2} \oplus C_{P_1,P_3}$ も成り立つ。
クエリは $Q$ 個なので、このグラフにおける頂点・辺の数は高々 $2Q$ 個であるため、 $O(Q^2)$ で解くことができます。

### 満点解法

クエリ 1 で与えられる情報の端点を移動して $L$ から $R$ にたどり着けるとき、経路に依らず $C_{L,R}$ が一意に定まることがわかります。<br>
よって、これはポテンシャルの概念と同じくとらえることができ、重み付き UnionFind を使って $O(Q)$ で解くことができます。
クエリ 1 で与えられる情報の端点を移動して $L$ から $R$ にたどり着けるとき、経路に依らず $B_{L,R}$ が一意に定まることがわかります。<br>
よって、これはポテンシャルの概念と同じくとらえることができ、重み付き UnionFind の重みとして $B_{L,R}$ を管理することで $O(Q)$ で解くことができます。

0 comments on commit 9b60ebd

Please sign in to comment.