• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C小加

            厚德 博學 求真 至善 The bright moon and breeze
            posts - 145, comments - 195, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            這道題糾結我了一天的時間,本以為用lowbit可以輕松搞定,可是中間出現了各種故障,WA了很多次才AC

            計算ab之間的節點數,可以用1-a1-b的節點數之差來求。在右子樹的點可以轉化為相應的左子樹的點,經過多步驟的轉化,可以把點的位置固定在樹的最左邊的那條線上。所以只需要計算每層最左邊的節點數就OK了。經過遞推會得出一個公式,z[i]=z[i-1]*2+i-1;i表示樹的高度。

            #include<iostream>
            #include<cstdio>
            #include<cmath>
            using namespace std;
            typedef long long ll;
            ll z[33]={0};//從1到n經過的點
            ll d[33]={0};//樹每層最左邊的序號
            void init()
            {
                for(int i=2;i<=31;i++)
                {
                    z[i]=z[i-1]*2+i-1;
                }
                d[1]=1;
                for(int i=2;i<=31;i++)
                {
                    d[i]=d[i-1]<<1;
                }
            }
            ll lowbit(ll x)
            {
                return x&(-x);
            }

            //得到數的二進制位數
            ll getbit(ll x)
            {
                ll cnt=0;
                while(x!=1)
                {
                    x>>=1;
                    cnt++;
                }
                return cnt;
            }
            void swap(int& a,int& b)
            {
                int temp=a;
                a=b;
                b=temp;
            }
            ll fun(ll x)
            {
                return d[getbit(x)+1];//得到位數對應的二進制數
            }
            ll solve(ll x)
            {
               ll bx=x-lowbit(x);
                if(bx==0)
                {
                    return z[getbit(x)];
                }
                else
                {

                    int temp=fun(x);
                    ll sum=solve(temp)+abs(solve(temp)-solve(temp-(x-temp)));

                    return sum;
                }
            }


            int main()
            {
            init();
                int a,b;
                while(scanf("%d %d",&a,&b)!=EOF)
                {

                    if(a>b) swap(a,b);
                    ll ba=solve(a);
                    ll bb=solve(b);
                    printf("%lld\n",bb-ba);
                }
                return 0;
            }

            久久99精品久久久久久久久久| 亚洲午夜福利精品久久| 日本欧美久久久久免费播放网| 久久狠狠爱亚洲综合影院| 久久久久AV综合网成人| 狠狠色丁香久久婷婷综| 久久最新免费视频| 人妻精品久久无码区| 久久精品人妻一区二区三区| 精品国产乱码久久久久久人妻| 久久精品国产精品亚洲精品| 久久天天躁狠狠躁夜夜avapp| 久久精品国产亚洲沈樵| 国产成人精品久久| 精品国产乱码久久久久久浪潮 | 亚洲国产精品高清久久久| 狠狠色丁香久久综合婷婷| 99久久做夜夜爱天天做精品| 91久久精品国产91性色也| 久久天堂AV综合合色蜜桃网| 麻豆国内精品久久久久久| 久久久久久久尹人综合网亚洲| 久久精品日日躁夜夜躁欧美| 香港aa三级久久三级老师2021国产三级精品三级在| 伊人久久大香线蕉av一区| 亚洲美日韩Av中文字幕无码久久久妻妇| 国内精品久久久久| 日韩精品久久无码中文字幕| 亚洲色欲久久久综合网| 亚洲乱码日产精品a级毛片久久 | 亚洲а∨天堂久久精品| 久久91精品国产91久久户| 久久久久久无码Av成人影院| 色婷婷久久综合中文久久蜜桃av | AV无码久久久久不卡蜜桃| 伊人久久大香线蕉亚洲五月天| 亚洲精品第一综合99久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国内精品久久久久影院日本| 久久天天躁狠狠躁夜夜96流白浆| 久久久久久国产精品免费无码|