• <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>

            Why so serious? --[NKU]schindlerlee

            2010年02月11日星期四.sgu155 && pku2201 笛卡爾樹的構造

            2010年02月11日星期四.sgu155 && pku2201
            笛卡爾樹的構造。
            將所有節點按照k的大小從小到大排序,這樣就得到了整棵樹的中序遍歷結果。
            接下來,由于a符合堆的性質,我們只要遞歸的尋找區間中最大的a,就能構造出整棵樹了。尋找
            區間最大值,也就是rmq問題,用sparse table或者線段樹都可以解決,這樣整個算法就完成了。
            sparse table 不會的,看這里,傳送門:
            http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Sparse_Table_%28ST%29_algorithm
            上面有詳細的 rmq,lca問題的算法

            笛卡爾樹在排好序的情況下有O(n)的構造方法,不過我不會...
            不過要排序,最好的復雜度都是O(nlogn),時間差不了多少....


             
             1 
             2 const int N = 50010;
             3 int table[24][N],pow2[24];
             4 int out[N][3];
             5 struct L {
             6     int a,k,idx;
             7     int left,right,parent;
             8     L(){}
             9 }data[N];
            10 bool cmp(const L& v1,const L& v2) { return v1.k < v2.k; }
            11 int n,deep;
            12 
            13 int rmq(int i,int j)
            14 {
            15   if (j < i) { swap(i,j); }
            16   int two = floor(log2(j - i + 1));
            17   int idx1 = table[two][i];
            18   int idx2 = table[two][j-pow2[two] + 1];
            19   if (data[idx1].a < data[idx2].a) {
            20       return idx1;
            21   }
            22   return idx2;
            23 }//http://www.shnenglu.com/schindlerlee
            24 void build_table()
            25 {
            26   int i,j,k;
            27   sort(data,data + n,cmp);
            28   for (i = 0;i <= 20;i++) { pow2[i] = 1 << i; }
            29   for (i = 0;i < n;i++) {
            30       table[0][i] = i;
            31   }
            32   deep = floor(log2(n));
            33   for (i = 1;i <= deep;i++) {
            34       for (j = 0;j + pow2[i-1< n;j++) {
            35           if (data[table[i-1][j]].a > data[table[i-1][j+pow2[i-1]]].a) {
            36               table[i][j] = table[i-1][j+pow2[i-1]];
            37           }else {
            38               table[i][j] = table[i-1][j];
            39               
            40           }
            41       }
            42   }
            43 }
            44 
            45 void dfs(int u,int beg,int end)
            46 {
            47   if (end <= beg) { return; }
            48 
            49   int ux = data[u].idx;
            50   if (u-1 >= beg) {
            51       int l = rmq(beg,u - 1);
            52       int lx = data[l].idx;
            53       out[ux][1= lx;
            54       out[lx][0= ux;
            55       dfs(l,beg,u-1);
            56   }
            57   if (end >= u+1) {
            58       int r = rmq(u + 1,end);
            59       int rx = data[r].idx;
            60       out[ux][2= rx;
            61       out[rx][0= ux;
            62       dfs(r,u+1,end);
            63 
            64   }
            65 }
            66 
            67 int main()
            68 {
            69   int i,j,k;
            70   scanf("%d",&n);
            71   for (i = 0;i < n;i++) {
            72       scanf("%d%d",&data[i].k,&data[i].a);
            73       data[i].idx = i + 1;
            74   }
            75   puts("YES");
            76   build_table();//構造rmq用的sparse table
            77   dfs(rmq(0,n-1),0,n-1); //遞歸構造樹
            78   for (i = 1;i <= n;i++) {
            79       printf("%d %d %d\n",out[i][0],out[i][1],out[i][2]);
            80   }
            81 
            82   return 0;
            83 }
            84 

            posted on 2010-02-11 16:23 schindlerlee 閱讀(1690) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            精品少妇人妻av无码久久| 亚洲日韩欧美一区久久久久我| 欧美日韩精品久久久免费观看| 久久99热这里只频精品6| 久久婷婷五月综合国产尤物app| 国产精品久久久久天天影视| 久久久久国产| 亚洲中文字幕无码久久精品1| 久久综合久久自在自线精品自| 国产午夜精品久久久久九九| 中文字幕无码av激情不卡久久| 九九精品99久久久香蕉| 久久久精品日本一区二区三区| 久久精品水蜜桃av综合天堂| 伊人伊成久久人综合网777| 久久99国产综合精品女同| 综合久久精品色| 久久久久久国产精品美女| 久久99精品国产麻豆| 亚洲午夜久久久久久噜噜噜| 国产ww久久久久久久久久| 久久九九青青国产精品| 久久精品九九亚洲精品| 亚洲国产精品无码久久久秋霞2| 久久夜色撩人精品国产| 国产成人无码精品久久久免费| 99久久99久久精品免费看蜜桃| 狠狠综合久久综合88亚洲| 伊人久久亚洲综合影院| 久久综合亚洲色HEZYO国产| 久久婷婷色综合一区二区| 精品国产综合区久久久久久| 久久夜色tv网站| 久久99热这里只有精品国产| 亚洲乱亚洲乱淫久久| 精品久久人人爽天天玩人人妻| 国产国产成人久久精品| 久久免费视频6| 久久婷婷色综合一区二区| 亚洲欧美日韩中文久久| 精品久久久久久无码专区 |