青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

QuXiao

每天進(jìn)步一點(diǎn)點(diǎn)!

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  50 隨筆 :: 0 文章 :: 27 評(píng)論 :: 0 Trackbacks
題目來(lái)源:

                PKU 2201 Cartesian Tree

分類:

                RMQ

原文:

 

Cartesian Tree

Time Limit: 10000MS


Memory Limit: 65536K

Total Submissions: 1196


Accepted: 423

Case Time Limit: 2000MS

Description

Let us consider a special type of a binary search tree, called a cartesian tree. Recall that a binary search tree is a rooted ordered binary tree, such that for its every node x the following condition is satisfied: each node in its left subtree has the key less then the key of x, and each node in its right subtree has the key greater then the key of x.
That is, if we denote left subtree of the node x by L(x), its right subtree by R(x) and its key by kx then for each node x we have

  • if y L(x) then ky < kx
  • if z R(x) then kz > kx


The binary search tree is called cartesian if its every node x in addition to the main key kx also has an auxiliary key that we will denote by ax, and for these keys the heap condition is satisfied, that is

  • if y is the parent of x then ay < ax


Thus a cartesian tree is a binary rooted ordered tree, such that each of its nodes has a pair of two keys (k, a) and three conditions described are satisfied.
Given a set of pairs, construct a cartesian tree out of them, or detect that it is not possible.

Input

The first line of the input file contains an integer number N -- the number of pairs you should build cartesian tree out of (1 <= N <= 50 000). The following N lines contain two numbers each -- given pairs (ki, ai). For each pair |ki|, |ai| <= 30 000. All main keys and all auxiliary keys are different, i.e. ki != kj and ai != aj for each i != j.

Output

On the first line of the output file print YES if it is possible to build a cartesian tree out of given pairs or NO if it is not. If the answer is positive, on the following N lines output the tree. Let nodes be numbered from 1 to N corresponding to pairs they contain as they are given in the input file. For each node output three numbers -- its parent, its left child and its right child. If the node has no parent or no corresponding child, output 0 instead.
The input ensure these is only one possible tree.

Sample Input

7

5 4

2 2

3 9

0 5

1 3

6 6

4 11

Sample Output

YES

2 3 6

0 5 1

1 0 7

5 0 0

2 4 0

1 0 0

3 0 0

Source

Northeastern Europe 2002, Northern Subregion

 

 

 

 

中文描述:

                有一種二叉樹(shù),叫笛卡爾樹(shù),樹(shù)的節(jié)點(diǎn)有兩個(gè)值:kak值滿足二叉排序樹(shù)的性質(zhì),a值滿足最小堆的性質(zhì)。即如果某個(gè)根節(jié)點(diǎn)root有兩個(gè)子節(jié)點(diǎn)leftright,那么left.k < root.k < right.k,且root.a < left.aroot.a < right.a。給你N(1 <= N <= 50 000)個(gè)節(jié)點(diǎn),問(wèn)你是否可以構(gòu)造出一棵笛卡爾樹(shù)。

 

題目分析與算法模型

                一開(kāi)始,自己是想根據(jù)最小堆的性質(zhì),擁有最小a值的那個(gè)節(jié)點(diǎn)一定是樹(shù)的根,接著再找兩個(gè)次小a值的節(jié)點(diǎn),它們必然是根的兩個(gè)子節(jié)點(diǎn),再根據(jù)k值決定節(jié)點(diǎn)是左兒子還是右兒子,然后再以此類推…………,但是在下一層就不對(duì)了。因?yàn)椴⒉皇菢?shù)的下一層節(jié)點(diǎn)的a值一定比上一層節(jié)點(diǎn)的a值大(它們不一定在同一棵子樹(shù))。

                可以換一個(gè)思維,把注意力放在k值上。要知道,如果對(duì)一顆二叉排序樹(shù)進(jìn)行前序搜索,k值是從小到大排序的。如果某個(gè)節(jié)點(diǎn)是根,那么它左邊的節(jié)點(diǎn)就構(gòu)成左子樹(shù),它右邊的節(jié)點(diǎn)就構(gòu)成右子樹(shù)。現(xiàn)在,那個(gè)根節(jié)點(diǎn)是哪一個(gè)?就是那個(gè)a值最小的節(jié)點(diǎn)!所以,我們可以對(duì)k值進(jìn)行排序,現(xiàn)在整個(gè)區(qū)間內(nèi)找到a值最小的節(jié)點(diǎn),他就是根。接著再在左邊和右邊的區(qū)間內(nèi)各找一個(gè)a值最小的節(jié)點(diǎn),看它們的節(jié)點(diǎn)的k值與根節(jié)點(diǎn)的k值是否滿足二叉排序樹(shù)的性質(zhì),如果滿足,就用相同的方法在左、右區(qū)間遞歸建立子樹(shù);如果不滿足,表示無(wú)法構(gòu)成笛卡爾樹(shù)。


                接下來(lái)的問(wèn)題就是,如何在一區(qū)間里找到最小的a值?最容易想到的就是O(n)復(fù)雜度的線性查找,但在此題中,N最大為50000,并且當(dāng)在一個(gè)較大區(qū)間內(nèi)查找到一個(gè)最值后,又要在一個(gè)較小的區(qū)間內(nèi)查找另一個(gè)最值,一些節(jié)點(diǎn)被查找了多次,造成時(shí)間的浪費(fèi)。那么,怎么高效的進(jìn)行多次的區(qū)間查詢呢?RMQ是一個(gè)不錯(cuò)的解決方法。大致思想是:先對(duì)區(qū)間內(nèi)的數(shù)進(jìn)行預(yù)處理,計(jì)算出從某一下標(biāo)開(kāi)始的某一特定長(zhǎng)度的最值。當(dāng)查找某一區(qū)間的最值時(shí),就可以把這個(gè)區(qū)間分解成一個(gè)或兩個(gè)已預(yù)先算出最值得區(qū)間,這樣就可以用O(1)的復(fù)雜度算出最值了。(具體講解請(qǐng)查閱相關(guān)資料)

 

代碼:

#include <iostream>

#include <cmath>

#include <algorithm>

using namespace std;

 

const int MAX = 50005;

 

struct Node

{

          int index;

          int k, a;

          int parent, left, right;

};

 

Node node[MAX];

int left, right;

int f[MAX][16];                  //f[i][j] is the index of the min a from i

                                 //to i + 2^j - 1

int n;

 

bool cmpByK (Node n1, Node n2)

{

          return ( n1.k < n2.k );

}

 

bool cmpByIndex (Node n1, Node n2)

{

          return ( n1.index < n2.index );

}

 

void Input ()

{

          int i;

          scanf("%d", &n);

          for (i=0; i<n; i++)

          {

                  scanf("%d%d", &node[i].k, &node[i].a);

                  node[i].index = i + 1;

          }

}

 

int Max (int a, int b)

{

          return ( a>b?a:b );

}

 

 

int Min (int a, int b)

{

          return ( a<b?a:b );

}

 

 

void Initial ()

{

          int i, k, m;

          sort(node, node+n, cmpByK);

 

 

          //RMQ

          for (i=0; i<n; i++)

                  f[i][0] = i;

 

          m = floor(log(double(n)) / log(double(2))) + 1;

          for (k=1; k<m; k++)

          {

                  for (i=0; i<n; i++)

                  {

                         f[i][k] = f[i][k-1];

                         if ( i + (1<<(k-1)) < n )

                         {

                                 if ( node[f[i][k-1]].a > node[f[i + (1<<(k-1))][k-1]].a )

                                         f[i][k] = f[i + (1<<(k-1))][k-1];

                         }

                  }

          }

}

 

 

int MinAIndex (int i, int j)

{

          int k;

          k = floor( log(double(j-i+1)) / log(double(2)) );

          if (node[f[i][k]].a <= node[f[j - (1<<k) + 1][k]].a)

                  return f[i][k];

          else

                  return f[j - (1<<k) + 1][k];

}

 

bool MakeTree (int i, int j)

{

          if ( i == j )

          {

                  node[i].left = node[i].right = 0;

                  return true;

          }

          int rootIndex, leftIndex, rightIndex;

          bool check1, check2;

          rootIndex = MinAIndex(i, j);

         

          if ( rootIndex != i )

                  leftIndex = MinAIndex(i, rootIndex-1);

          if ( rootIndex != j )

                  rightIndex = MinAIndex(rootIndex+1, j);

 

          check1 = true;

          if ( rootIndex != i && node[rootIndex].k > node[leftIndex].k )

          {

                  node[rootIndex].left = node[leftIndex].index;

                  node[leftIndex].parent = node[rootIndex].index;

                  check1 = MakeTree(i, rootIndex-1);

          }

          check2 = true;

          if ( rootIndex != j && node[rootIndex].k < node[rightIndex].k )

          {

                  node[rootIndex].right = node[rightIndex].index;

                  node[rightIndex].parent = node[rootIndex].index;

                  check2 = MakeTree(rootIndex+1, j);

          }

 

          return ( check1 && check2 );

}

         

void Solve ()

{

          if ( MakeTree(0, n-1) )

          {

                  printf("YES\n");

                  sort(node, node+n, cmpByIndex);

                  for (int i=0; i<n; i++)

                  {

                         printf("%d %d %d\n", node[i].parent, node[i].left, node[i].right);

                  }

          }

          else

          {

                  printf("NO\n");

          }

}

 

int main ()

{

          Input ();

          Initial ();

          Solve ();

 

          return 0;

}

 

posted on 2008-04-25 21:27 quxiao 閱讀(1018) 評(píng)論(1)  編輯 收藏 引用 所屬分類: ACM

評(píng)論

# re: PKU 2201 Cartesian Tree[未登錄](méi) 2009-05-12 12:20 k
笛卡爾樹(shù)在排好序的情況下有o(n)構(gòu)造法  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本中文字幕区| 亚洲免费在线观看| 亚洲视频自拍偷拍| 91久久在线播放| 久久精品国产亚洲一区二区三区 | 午夜伦理片一区| 日韩亚洲欧美精品| 男女激情视频一区| 久久久久青草大香线综合精品| 国产精品美女一区二区在线观看| 亚洲欧洲一区二区三区久久| 狠狠网亚洲精品| 欧美中日韩免费视频| 久久国产一区| 国产日韩一区二区三区| 亚洲欧美另类在线| 性刺激综合网| 国产色视频一区| 性伦欧美刺激片在线观看| 欧美一区成人| 国产偷久久久精品专区| 午夜亚洲伦理| 久久视频国产精品免费视频在线| 国产欧美日韩亚洲一区二区三区| 亚洲一区久久| 久久福利毛片| 一区二区在线观看视频| 久久久久久久久久久成人| 老司机免费视频久久| 伊人狠狠色j香婷婷综合| 久久久久欧美精品| 欧美激情视频网站| 99国产精品久久久久老师| 欧美日韩一区在线播放| 亚洲一区二区三区视频播放| 久久激情网站| 亚洲国产精品视频一区| 欧美区亚洲区| 午夜精品久久久久久久久久久久 | 在线亚洲一区二区| 国产精品久久久久久久久免费桃花| 亚洲欧美日本在线| 久久亚洲综合网| 亚洲精品日韩在线观看| 欧美揉bbbbb揉bbbbb| 性久久久久久久久| 欧美国产亚洲视频| 亚洲欧美99| 在线免费观看日韩欧美| 欧美屁股在线| 欧美一区二区三区在线观看视频| 欧美大片免费| 欧美一级片久久久久久久| 影音先锋日韩精品| 欧美日韩一级片在线观看| 欧美一区二区免费观在线| 亚洲国产成人久久综合| 亚洲欧美资源在线| 亚洲电影免费在线观看| 国产精品成av人在线视午夜片| 久久精品国产亚洲aⅴ| 日韩视频在线免费| 久久深夜福利| 亚洲欧美激情在线视频| 亚洲第一网站| 国产精品女人网站| 蜜臀av国产精品久久久久| 亚洲午夜在线观看视频在线| 欧美高清视频www夜色资源网| 亚洲欧美激情视频| 亚洲国产视频一区二区| 国产日韩欧美精品| 欧美日韩精品福利| 免费成人av资源网| 欧美一区二区高清在线观看| 亚洲美女少妇无套啪啪呻吟| 蜜桃久久精品一区二区| 亚洲欧美在线视频观看| 99精品视频免费观看| 在线观看欧美一区| 国产日韩av一区二区| 欧美视频一区二区三区在线观看| 裸体女人亚洲精品一区| 欧美在线不卡视频| 亚洲尤物在线| 日韩视频一区二区| 亚洲国产欧美一区二区三区丁香婷| 久久午夜电影网| 欧美在线中文字幕| 亚洲免费网站| 亚洲永久在线| 亚洲一区二区三区免费观看 | 亚洲欧美国产精品va在线观看| 亚洲精品国产精品乱码不99| 在线成人激情| 精品99一区二区| 国模私拍视频一区| 国产亚洲精品bv在线观看| 国产乱子伦一区二区三区国色天香| 欧美午夜电影在线| 欧美日韩中文字幕精品| 欧美日韩在线精品| 欧美日韩在线另类| 欧美日韩亚洲一区三区| 欧美丝袜一区二区三区| 国产精品高清一区二区三区| 欧美午夜不卡视频| 国产精品乱码妇女bbbb| 国产欧美欧洲在线观看| 国产欧美日韩亚洲一区二区三区 | 亚洲欧美日韩国产成人精品影院| 亚洲午夜在线观看视频在线| 亚洲一区二区三区涩| 午夜精品99久久免费| 欧美在线二区| 久久一区欧美| 亚洲大片在线观看| 亚洲精品中文字幕在线| 夜夜躁日日躁狠狠久久88av| 亚洲一区二区三区乱码aⅴ| 亚洲你懂的在线视频| 久久国产精品亚洲77777| 久久午夜羞羞影院免费观看| 欧美大片免费观看在线观看网站推荐| 欧美激情一区| 国产精品久久久久久影视| 国产一区在线播放| 91久久久久久久久| 亚洲免费视频在线观看| 久久九九电影| 亚洲国产精品123| 一区二区成人精品| 久久精品欧美日韩| 欧美极品影院| 国产欧美日韩一区二区三区在线观看 | 久久婷婷国产综合精品青草| 欧美精品久久天天躁| 国产精品激情电影| 国内偷自视频区视频综合| 日韩亚洲精品在线| 久久精品成人欧美大片古装| 欧美国产亚洲另类动漫| 亚洲一区二区在线视频| 蜜桃av综合| 国产伦理精品不卡| 亚洲精品视频在线观看网站 | 亚洲精品视频免费| 欧美一区二区| 欧美日韩另类字幕中文| 一区精品在线| 亚洲免费网址| 亚洲激情视频在线播放| 欧美一区二视频| 欧美日韩精品伦理作品在线免费观看| 国产丝袜一区二区| 99国产麻豆精品| 欧美va天堂| 亚洲欧美在线播放| 欧美激情免费观看| 国产日韩欧美一区二区三区在线观看| 亚洲日本黄色| 久久久久久穴| 亚洲中字黄色| 欧美日韩国产91| 亚洲国产欧美在线| 久久精品国亚洲| 亚洲无限乱码一二三四麻| 欧美fxxxxxx另类| 国内成+人亚洲| 亚洲午夜成aⅴ人片| 亚洲高清网站| 久久久国产午夜精品| 国产精品久99| 亚洲视频一区| 亚洲国语精品自产拍在线观看| 久久久噜久噜久久综合| 国产精品亚洲片夜色在线| 正在播放亚洲一区| 亚洲人成在线播放网站岛国| 免费一区视频| 亚洲国产精品va在看黑人| 免费在线看成人av| 久久精品视频播放| 国内精品免费午夜毛片| 久久精品国产久精国产一老狼 | 欧美连裤袜在线视频| 亚洲狠狠婷婷| 欧美国产日韩一区二区| 久久久91精品| 在线国产日韩| 欧美国产国产综合| 久久中文欧美| 亚洲国产精品尤物yw在线观看| 免费亚洲电影在线| 免费永久网站黄欧美| 亚洲激情国产精品| 亚洲第一精品电影| 欧美区在线观看| 一区二区日韩免费看| 99亚洲一区二区|