AtCoder Beginner Contest 261 メモ(A-E)
今回の結果
4AC
A問題に時間かけすぎた。
今回はC問題がかなり簡単でD問題も易しめだったので、D問題が解けたことで自分のパフォーマンスが出せたかな。
A - Intersection
Difficulty: 51
問題文
数直線があり、高橋君はこれを赤色と青色で次のように塗りました。
-
からX=L_1 までをすべて赤色で塗る。X=R_1 -
からX=L_2 までをすべて青色で塗る。X=R_2
数直線のうち、赤色と青色の両方で塗られている部分の長さを求めてください。
制約
-
0≤L_1<R_1≤100 -
0≤L_2<R_2≤100 -
入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
両方の色で塗られている部分の長さを整数で出力せよ。
入出力例
入力例 1
0 3 1 5
出力例 1
2
入力例 2
0 1 4 5
出力例 2
0
入力例 3
0 3 3 7
出力例 3
0
参加中に考えたこと
数直線は苦手。L1,R1,L2,R2の4つの位置関係をif文で分岐させて解くんだけろうけど、パターンが漏れていてWAしてしまった。。
パターンが多くて洗い出すのが大変。
赤と青を入れ替えて必ず赤が左に来るようにすればパターンは半分には減らせるけども、それでも3パターン必要になるのか。
いっそ配列作ってシミュレーションして重なっている部分を数え上げようかとも思ったけど結局if文で解いた。
A問題にしてはちょっと難しい?
考察・感想
この発想が持てなかった。3本以上の共通点を探す場合はif文ではしんどいのでこの方法を使うことになるかな。
B - Tournament Result
Difficulty: 74
問題文
-
であり、それ以外のとき W
, L
, D
のいずれかです。
W
, L
, D
であることは、人
与えられた表に矛盾があるかどうかを判定してください。
次のいずれかが成り立つとき、与えられた表には矛盾があるといいます。
- ある組
が存在して、人(i,j) が人i に勝ったが、人j が人j に負けていないi - ある組
が存在して、人(i,j) が人i に負けたが、人j が人j に勝っていないi - ある組
が存在して、人(i,j) が人i に引き分けたが、人j が人j に引き分けていないi
制約
2≤N≤1000 -
はA_{i,i} -
である -
のとき、i \ne j はA_{i,j} W
,L
,D
のいずれかである
入力
入力は以下の形式で標準入力から与えられる。
出力
与えられた表に矛盾がないとき correct
、矛盾があるとき incorrect
と出力せよ。
入出力例
入力例 1
4
-WWW
L-DD
LD-W
LDW-
出力例 1
incorrect
入力例 2
2
-D
D-
出力例 2
correct
参加中に考えたこと
入力を二次元配列に入れた後、変数 a[i][j]
とa[j][i]
の関係が正しいかを判定すれば良さそう。
ループは対角線上の片方だけでよく、 -
なので、
C - NewFolder(1)
Difficulty: 179
問題文
-
の中にS_1 ,…,S_{i−1} と同じ文字列が存在しないならば、S_i を出力する。S_i -
の中にS_1 ,…,S_{i−1} と同じ文字列がS_i 個X 存在するならば、(X>0) を文字列として扱ってX S_i + (
+X+ )
を出力する。
制約
1≤N≤2×10^5 -
は英小文字のみからなる長さS_i 以上1 以下の文字列10
入力
入力は以下の形式で標準入力から与えられる。
出力
問題文中の指示にしたがって、
入出力例
入力例 1
5
newfile
newfile
newfolder
newfile
newfolder
出力例 1
newfile
newfile(1)
newfolder
newfile(2)
newfolder(1)
入力例 2
11
a
a
a
a
a
a
a
a
a
a
a
出力例 2
a
a(1)
a(2)
a(3)
a(4)
a(5)
a(6)
a(7)
a(8)
a(9)
a(10)
参加中に考えたこと
連想配列を使えばよさそう。
mapで
考察・感想
今回のC問題は易しかった。B問題と同じくらいの時間で解けた。
D - Flipping and Bonus
Difficulty: 801
問題文
高橋君が
- 表が出たとき:高橋君はカウンタの数値を
増やし、1 円もらう。X_i - 裏が出たとき:高橋君はカウンタの数値を
に戻す。お金をもらうことは出来ない。0
また、
高橋君は最大で何円もらうことができるかを求めてください。
制約
1≤M≤N≤5000 1≤X_i ≤10^9 1≤C_i ≤N 1≤Y_i ≤10^9 -
はすべて異なる。C_1 ,C_2 ,…,C_M - 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
高橋君がもらうことのできる金額の最大値を整数で出力せよ。
入出力例
入力例 1
6 3
2 7 1 8 2 8
2 10
3 1
5 5
出力例 1
48
入力例 2
3 2
1000000000 1000000000 1000000000
1 1000000000
3 1000000000
出力例 2
5000000000
参加中に考えたこと
DPかなぁって当たりをつける。
縦軸はコイントスの回数で、横軸はカウンタの数値としてやればうまくいきそう。
基本的なDPの問題によくあるような右下になるほど値が大きくなるようなかたちにはならない。
DPの遷移としては、表が出た時はカウンタは1つ進み、裏が出た時は0に進むというかたちになる。
表が出た時はあわせてボーナスの加算も行うようにする。ここはmap使うと分岐がなくて済む。
裏が出た時は全てカウンタは0になるので、
求める答えも同様に
考察・感想
DPで用意する配列は2次元配列を用意する方法もあるが、1次元配列を2つ用意する方法もある。
この問題の値の更新の仕方としては、
となり、
2次元配列の方がプログラムは楽になると思うが、デバッグ時に必要な情報だけが出るのがメリットがあると感じていて自分は1次元配列2つで書いている。提出された回答一覧を見ると、メモリが100,000 KB以上なら2次元配列、3,000 KBとかなら1次元配列2つというのが見て取れる。圧倒的に2次元配列派が多い。
E - Many Operations
Difficulty: 1261
問題文
変数
-
のとき、T_i = 1 の値をX に置き換える。X and A_i -
のとき、T_i = 2 の値をX に置き換える。X or A_i -
のとき、T_i = 3 の値をX に置き換える。X xor A_i
変数
- 操作
を行い、操作後の1 の値を出力する。X - 続けて、操作
を順に行い、操作後の1,2 の値を出力する。X - 続けて、操作
を順に行い、操作後の1,2,3 の値を出力する。X \vdots - 続けて、操作
を順に行い、操作後の1,2,…,N の値を出力する。X
制約
1≤N≤2×10^5 1≤T_i≤3 0≤A_i<2^{30} 0≤C<2^{30} - 入力に含まれる値は全て整数である
入力
入力は以下の形式で標準入力から与えられる。
出力
問題文中の指示に従って
入出力例
入力例 1
3 10
3 3
2 5
1 12
出力例 1
9
15
12
入力例 2
9 12
1 1
2 2
3 3
1 4
2 5
3 6
1 7
2 8
3 9
出力例 2
0
2
1
0
5
3
3
11
2
参加中に考えたこと
論理演算の問題。操作はそのままビット演算するとして、どうやって計算量を抑えるんだ?
考察・感想
解説見てACまでさせた。ポイントとしては2点。
- AND,OR,XORは各ビットの値が変わるだけなので独立して考えられる
- 合成関数
を作る(f(x)=f_i \circ f_{i-1} \circ \dots f_1)
ビットごとに独立して考える方針だと、操作後の値もそのままビットごとになりがちだと思う。
一発で出す方法は分かるとなるほどと思うがコンテスト中に思いつくのは難しそう。
Discussion