Cat Virus
题意:
让你构造一颗树,要求如果一个点为黑,其子树全为黑,白点任意,现在让你构造一棵树,使其染色方案数为K,节点尽可能少
题解:
首先画出k<=9的全部情况,并找规律
我们发现,如果k为奇数,则根节点左连一个点,右连一个点,然后K除以2,如果k为偶数,右侧连一个点,使得k-1,这样k又为奇数,一直循环
当k=3时记得特判
u1s1,想不到。。比赛时真的没想到
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL k;
int main(){cin>>k;LL fa=1,id=1,tmp=k,cnt=1;while(tmp>3){if(tmp&1){tmp/=2;cnt+=2;}else{tmp--;cnt++;}}if(tmp==3) cnt++;//多加一个点 cout<<cnt<<endl;while(k>3){if(k&1){//奇数 k/=2;id++;cout<<fa<<" "<<id<<endl;//左 id++;cout<<fa<<" "<<id<<endl;//右 fa=id;}else{//奇数 k--;id++; cout<<fa<<" "<<id<<endl;//右边 fa=id;}}if(k==3){id++;cout<<fa<<" "<<id<<endl;//特判情况,连一个右边 }
}