hdu 5573 Binary Tree(传说中的构造)

来源:互联网 发布:360数据恢复软件比较差 编辑:程序博客网 时间:2024/05/21 11:25

这题第一眼见到,觉得是个dfs,但是呢,不知道怎么,看着简单但也没去写,(好在没去写),然后下来后,自己傻乎乎的去写dfs,然后果然炸了,毕竟我的裸dfs,复杂度又4^60….(不对,每一个要乘以个2^(i-1))..
然后就不知所措,上网搜了一下,发现是构造,但是呢,现在虽然我好像懂了,但肯定过几天我又不懂了,所以也不多说.
核心就是,他们说的只要使用前k-1层和最后一层搞一搞,就能搞出[0,2^k],感觉也真玄幻呢,然后还有一个地方就是他计算每一个地方是0还是1的方法,因为这里0不是代表没有,而是代表要减去,所以两倍.
构造难就难在,想到了没什么难度,就是难想到.

/*  xzppp  */#include <iostream>#include <vector>#include <cstdio>#include <string.h>#include <algorithm>#include <queue>#include <map>#include <math.h>#include <string>using namespace std;#define FFF freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define MP make_pair#define PB push_backtypedef long long  LL;typedef unsigned long long ULL;const int MAXN = 1e5+17;const int MAXM = 20;const int INF = 0x7fffffff;const int MOD = 1e9+7;int main(){    #ifndef ONLINE_JUDGE     FFF    #endif    int t,cs= 1 ;    cin>>t;    while(t--)    {        printf("Case #%d:\n",cs++);        int n,k;        cin>>n>>k;        bool rgh = false;        if(!(n&1))        {            rgh = true;            n--;        }        int dif = ((1<<k)-1-n)/2;        int now = 1<<(k-1);        vector<int > ans;        for (int i = 0; i < k; ++i)        {            //cout<<dif<<"  "<<now<<endl;            if(dif>=now)            {                ans.PB(0);                dif -= now;            }            else                ans.PB(1);            now>>=1;        }        now = 1;        for (int i = ans.size()-1; i > -1; --i)        {            if(rgh&&i==0) now++;            printf("%d %c\n",now,ans[i]==1?'+':'-');            now<<=1;        }    }    return 0;}