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

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ù)?,F(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>
            亚洲大片av| 欧美一区二区三区免费在线看| 国产欧美精品日韩精品| 亚洲三级国产| 91久久精品美女| 久久精品视频在线观看| 欧美中文字幕精品| 国产精品爽爽ⅴa在线观看| 日韩天堂av| 一本色道久久加勒比88综合| 免费av成人在线| 欧美电影免费观看高清完整版| 国产一区二区按摩在线观看| 性欧美在线看片a免费观看| 欧美激情a∨在线视频播放| 久久综合久久综合久久| 国内外成人免费激情在线视频| 午夜伦理片一区| 欧美在线视频免费播放| 国产精品视频九色porn| 午夜精品偷拍| 久久男人资源视频| 在线电影一区| 欧美成人精品h版在线观看| 欧美激情欧美狂野欧美精品| 亚洲精品一区二区三区福利| 欧美国产精品日韩| 日韩亚洲欧美成人| 欧美一区2区三区4区公司二百| 国产乱码精品一区二区三| 午夜日韩福利| 欧美二区在线观看| 99国产精品99久久久久久| 国产精品mv在线观看| 亚洲在线视频免费观看| 久久一区二区三区超碰国产精品| 在线成人激情视频| 欧美精选一区| 午夜精品视频在线| 欧美成人免费网站| 亚洲视频精品在线| 国产精品一级在线| 久久久久国产精品www| 亚洲高清不卡一区| 午夜精品免费视频| 在线观看欧美成人| 欧美日韩 国产精品| 午夜日韩在线| 91久久精品国产91性色| 校园春色国产精品| 亚洲人www| 国产欧美日本一区视频| 免费精品视频| 亚洲一区区二区| 免费久久99精品国产自| 亚洲综合精品| 亚洲国产精品一区二区www在线| 欧美日韩一区二区三区四区在线观看| 亚洲一区二区免费看| 欧美成年人视频网站| 亚洲欧美日韩一区在线| 亚洲欧洲精品一区二区精品久久久| 欧美色综合天天久久综合精品| 久久精品国产久精国产思思| 亚洲精品视频免费观看| 狂野欧美性猛交xxxx巴西| 亚洲丝袜av一区| 亚洲激情一区二区三区| 国产午夜亚洲精品理论片色戒| 欧美激情精品久久久久久蜜臀| 亚洲在线免费观看| 日韩亚洲精品电影| 欧美激情a∨在线视频播放| 久久精品三级| 午夜精品福利视频| 亚洲最黄网站| 亚洲人被黑人高潮完整版| 国产真实久久| 国产欧美在线看| 国产精品久久久一本精品| 欧美极品一区二区三区| 久久综合色一综合色88| 久久精品99| 欧美一区二区三区免费在线看| 亚洲视频一区在线| 夜夜嗨av一区二区三区四区| 亚洲国产精品成人| 欧美高清视频| 国产精品视频在线观看| 欧美天堂亚洲电影院在线播放| 欧美成人官网二区| 欧美aaaaaaaa牛牛影院| 久久综合久久综合九色| 久久久人成影片一区二区三区| 久久成人av少妇免费| 欧美在线日韩| 欧美在线观看视频在线| 久久9热精品视频| 欧美亚洲免费高清在线观看| 亚洲欧美日韩人成在线播放| 亚洲欧美福利一区二区| 亚洲综合国产| 亚洲欧美中日韩| 欧美一区二区三区视频在线| 欧美一区二区三区免费观看视频 | 国产日韩一区在线| 国产主播精品| 亚洲电影免费观看高清| 亚洲黄色成人网| 99精品欧美一区二区三区综合在线| 亚洲乱亚洲高清| 亚洲天堂成人| 欧美在线视屏| 久久综合狠狠| 91久久久久久久久久久久久| 亚洲三级观看| 亚洲综合清纯丝袜自拍| 久久精品99| 欧美激情 亚洲a∨综合| 欧美午夜精品久久久久久浪潮| 国产精品丝袜久久久久久app| 99精品免费| 亚洲中无吗在线| 久久亚洲免费| 欧美日韩国产va另类| 国产精品视频一二三| 伊人久久综合97精品| 99在线视频精品| 欧美亚洲一区| 欧美大片在线看免费观看| 亚洲精品小视频在线观看| 亚洲欧美日韩电影| 美女视频黄a大片欧美| 欧美日韩综合久久| 狠狠88综合久久久久综合网| 99精品国产在热久久婷婷| 午夜国产精品影院在线观看 | 亚洲国产导航| 午夜精品久久久久久99热| 另类天堂av| 国产麻豆日韩| 99riav久久精品riav| 久久精品欧美日韩| 亚洲另类春色国产| 久久精品一区二区三区不卡| 欧美日韩在线亚洲一区蜜芽| 狠狠v欧美v日韩v亚洲ⅴ| 一区二区三区四区蜜桃| 免费欧美视频| 亚洲免费在线看| 欧美二区在线看| 国内精品久久久| 午夜精品福利在线观看| 亚洲高清激情| 久久久久www| 亚洲国产一二三| 欧美影院在线| 国产精品分类| 一本色道久久99精品综合| 免费中文字幕日韩欧美| 亚洲在线网站| 欧美亚州韩日在线看免费版国语版| 在线播放国产一区中文字幕剧情欧美| 中文亚洲字幕| 亚洲欧洲一区二区天堂久久 | 亚洲国产高清一区| 久久久成人精品| 亚洲欧美国产日韩中文字幕| 欧美视频一区二区三区在线观看 | 一区二区视频欧美| 久久精品人人做人人综合| 国产精品99久久久久久久vr| 欧美片第一页| 日韩视频在线观看免费| 欧美成人免费全部观看天天性色| 欧美在线影院在线视频| 国产欧美日韩另类视频免费观看| 亚洲一区二区三区四区五区午夜| 亚洲欧洲日韩在线| 欧美成人午夜| 亚洲欧洲偷拍精品| 亚洲国产精品视频| 欧美电影免费观看大全| 91久久在线观看| 欧美激情视频在线播放 | 中国成人黄色视屏| 国产精品福利在线| 西瓜成人精品人成网站| 亚洲永久网站| 国产亚洲一区二区精品| 久久久久久久欧美精品| 久久国产精品高清| 在线观看一区欧美| 欧美韩日一区二区三区| 欧美国产精品va在线观看| 在线一区二区三区四区| 一本色道久久加勒比精品| 国产精品扒开腿爽爽爽视频| 午夜在线成人av| 欧美在线免费视屏|