Codeforces Round #554 (Div. 2)

bqaya

 

A. Neko Finds Grapes

問題:n個の整数列Aとm個の整数列Bを1:1マッチングして、足して奇数になる組を最大化せよ

 

考察:

それぞれで奇数偶数の数を数えます。

奇数と偶数のマッチングしかないので、それぞれの小さいほうを足せばよいです。

 

 

 

 

 

B. Neko Performs Cat Furrier Transform

問題:ある整数xが与えられる。これを以下の操作をして2^m-1にせよ

操作:k>=0で2^k-1をXORする。+1する。

 

 

考察:

まずXORで下位bitがすべて変わることから、上から決めるほうがよさそうです。

既に1のbitは変える必要がないので、一番上にある0から下を変えましょう

 

下k桁がすべて0か、1が混じるかで場合分けします。

前者の場合は一番上の0の1つ下をkにして、後者の場合は一番上の0をkとすればよいです

 

 

 

C. Neko does Maths

問題:整数a,bが与えられる。a+k,b+kのLCMを最小化するkを求めよ。

 

考察:

a<bとします。a+kとb+kのgcdはb-aの約数にしかならないので、そのような最小のkを全探索し、各回でLCMを愚直に求めました。

 

WA on test 8

 

 

 

D. Neko and Aki's Prank

問題:長さ2nの()の対応が取れた文字列を作りたい。これを木の遷移で表すとする。色のついた辺同士が頂点を共通に持たないように、辺に色を塗る。色のついた辺を最大化せよ。

 

考察:

valueを(で+1、)で-1するものとします。対応が取れた文字列とは、すべての地点でvalueが0以上で、最後に0になるものです。

 

残りの試行で全てマイナスしなければ実現不可能

いまのvalueが0のとき

 

上では、マイナスするしかないです。下ではプラスするしかないです。それ以外ではどちらも可能です。

 

これをDPします。

このとき、1つ前の辺は1つしかないです。これが塗られているか塗られていないかで場合分けでき、状況は無差別です。

 

したがってDP配列を2つ持てば解くことができます。

遷移先が2つ

  前が色あり:両方塗らない

  前が色なし:片方だけ塗る

遷移先が2つ

  前が色あり:塗らない

  前が色なし:塗る

 

この貪欲で最適解が求まります。

なぜなら、もし2連続でわざと塗らない箇所を作ると、1つ減るかそのままです。

端点までの長さの偶奇で変わりますが、増えることはないです。

 

以上でO(N^2)で解くことができました。