CFラウンド#633
A.パターンを見つける
ペイントを開始
https://www.luogu.com.cn/record/32752272
B.建設、数学
n個の番号を指定して、それらのシーケンスを見つける
このシーケンスの前と次の差によって形成される絶対値シーケンスを非降順シーケンスにする
アイデア:最初に小さいものから大きいものに並べ替えます
最大のものは最後にあり、最小のものは最後から2番目で、2番目に大きいものは最後から2番目、2番目に小さいものは最後から2番目のものです...
注意奇数特判
https://www.luogu.com.cn/record/32752274
C.数学
シーケンスを考える
T秒間に任意の数の要素に2 ^(T-1)を追加できます
ここで、シーケンスを下降しないようにするために終了する必要がある少なくとも秒数を尋ねます
アイデア:明らかに、その最終的な値を可能な限り小さくし、Pの合計と2の累乗の組み合わせは、1-2 ^(P + 1)-1のすべての可能な値を構成できるため、要素の比率に遭遇すると前者は小さいので、前者と同じにすることができます
統計によると、最大の差は左端の桁にあります。
https://www.luogu.com.cn/record/32752240
D.検索、XOR
ツリーが与えられたら、2つの子ノードによって形成される単純なパスのXOR合計が0になるようなエッジの重みを指定する必要があります
あなたが欲しい体重のタイプは最小で、最大は
アイデア:
まず、ツリー、ノードのいずれか1つを使用してツリーを作成します(必ずしもバイナリツリーではありません)。
最小は1または3にすぎません。
リーフノード間に形成されたパスがエッジである場合、同じ値を割り当てることができ、特異なエッジが存在する場合、理由として少なくとも3つの数値が必要です(パスをチェーンに圧縮することを検討できます) 、チェーンの奇数は3
ツリーの構造はランダムであるため、すべてのサブツリーの葉ノードの深度パリティは同じであり、1になる場合があります。
順番に考える
すべての辺を数えることができると仮定し、どの辺が真でないかを確認します
たとえば、親ノードは2つの個別の子ノードにのみ接続されているため、2つのエッジは同じである必要があります。つまり、エッジが1つ少なくなります。
void dfs(int cur,int fa,int depth)
{
if(node[cur].size()==1)
{
if(depth&1)ji=1;
else ou=1;
ans-=vis[node[cur][0]];
vis[node[cur][0]]=1;
}
for(int i=0;i<node[cur].size();i++)
{
if(node[cur][i]!=fa)dfs(node[cur][i],cur,depth+1);
}
}
注目
ans-=vis[node[cur][0]];
vis[node[cur][0]]=1;
次のように書くことはできません
ans-=vis[fa];
vis[fa]=1;
運命でツリーを構築するため、親ノード自体がリーフノードである可能性があるため、特に注意してください