• <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 閱讀(1689) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            久久精品国产亚洲精品| 精品久久久噜噜噜久久久| 香蕉久久AⅤ一区二区三区| 精品久久久久久久久免费影院| 久久人人爽人人爽人人片AV高清| 久久亚洲私人国产精品| 一级做a爰片久久毛片16| 日本久久久久久久久久| 99久久无色码中文字幕| 欧美久久一级内射wwwwww.| 国内精品久久久久影院日本| 精品久久久久久无码国产 | 久久精品国产99国产精偷| 久久影视综合亚洲| 久久男人Av资源网站无码软件| 精品国产一区二区三区久久蜜臀| 欧美丰满熟妇BBB久久久| 亚洲精品国产综合久久一线| 嫩草影院久久国产精品| 久久精品国产亚洲AV不卡| 久久精品国产精品亚洲人人 | 91精品国产91久久久久久青草| 久久精品国产亚洲7777| 国产精品99久久99久久久| 精品熟女少妇AV免费久久| 久久精品亚洲男人的天堂| 青青国产成人久久91网| 久久久免费精品re6| 少妇高潮惨叫久久久久久| 国产美女亚洲精品久久久综合| 久久这里只有精品视频99| 久久99精品久久久久久齐齐| 91精品国产高清久久久久久国产嫩草| 亚洲精品乱码久久久久66| 中文字幕乱码人妻无码久久| 伊人久久大香线蕉精品不卡| 青青热久久国产久精品| 色噜噜狠狠先锋影音久久| 91久久国产视频| 久久久久无码国产精品不卡| 久久综合五月丁香久久激情|