关闭

SGU 155 Cartesian Tree(笛卡尔树)

标签: sgu
721人阅读 评论(0) 收藏 举报
分类:

题意:根据给出的key和val的值,构造一棵笛卡尔树。

思路:一个裸题,不过以前没写过笛卡尔树,这东西意外的好写……首先按key值排序,然后依次插入,可以看出后插入的节点一定是在最右侧,剩下就是根据val的值去改变树的形态,用一个栈去存当前的右链,当插入一个新节点时,从栈中找到第一个比当前节点小的节点作为当前节点的父亲,其他节点为当前节点的左子树。


代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=50000+10;
int pa[maxn],lson[maxn],rson[maxn];
int conv[maxn];
struct Node
{
    int id,va,vb;
    bool operator <(const Node &a) const
    {
        return va<a.va;
    }
}node[maxn];
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    memset(pa,0,sizeof(pa));
    memset(lson,0,sizeof(lson));
    memset(rson,0,sizeof(rson));
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d",&node[i].va,&node[i].vb);
        node[i].id=i;
    }
    sort(node+1,node+n+1);
    conv[node[1].id]=1;
    stack<int>S;
    S.push(1);
    for(int i=2;i<=n;++i)
    {
        conv[node[i].id]=i;
        int fp=0,sp=0;
        while(!S.empty())
        {
            int tmp=S.top();
            //pa[sp]=tmp;
            if(node[tmp].vb<node[i].vb)
            {
                fp=tmp;
                break;
            }
            else
            {
                //pa[tmp]
                sp=tmp;
                S.pop();
            }
        }
        pa[i]=fp;
        rson[fp]=i;
        lson[i]=sp;
        pa[sp]=i;
        S.push(i);
    }
    printf("YES\n");
    for(int i=1;i<=n;++i)
    {
        int p=conv[i];
        printf("%d %d %d\n",node[pa[p]].id,node[lson[p]].id,node[rson[p]].id);
    }
    return 0;
}

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

POJ 2201 Cartesian Tree 笛卡尔树裸题加讲解

题目:http://poj.org/problem?id=2201题意:给出一个n,在给出n对数(且命名为x,y),构建一棵树,满足以下条件: 对树上任意一个节点,有x > leftson_x 且x ...
  • discreeter
  • discreeter
  • 2017-08-04 10:29
  • 132

pta--笛卡尔树

题目链接:点击打开链接 建一颗二叉树,同一节点指向两个不同的数据就行,之后就是判断,,二叉搜索树的中序遍历应该是递增的,然后k2节点的判断按照数组i*2和i*2+1分别是树的左右节点判断是否大于根节...
  • ACpartner
  • ACpartner
  • 2016-07-17 11:18
  • 805

Right-heavy tree——笛卡尔树

一、Problem Description:     A right-heavy tree is a binary tree where the value of a node is greate...
  • HOMERUNIT
  • HOMERUNIT
  • 2016-05-23 20:29
  • 166

5-31 笛卡尔树 (25分)

5-31 笛卡尔树   (25分) 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次...
  • qq_26437925
  • qq_26437925
  • 2015-10-31 07:53
  • 1405

5-6 笛卡尔树 (25分)

5-6 笛卡尔树   (25分) 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2016-11-22 00:56
  • 1015

PAT(笛卡尔树)

点击打开链接 注释应该蛮清楚的: #include #include #include using namespace std; struct BST{    int key;       /...
  • lfb637
  • lfb637
  • 2017-09-28 21:31
  • 143

浙大PAT 4-09. 笛卡尔树 (解题思路)

4-09. 笛卡尔树 时间限制 400 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 笛卡尔树是一种特殊的二叉树,其结...
  • a418382926
  • a418382926
  • 2014-03-30 18:13
  • 1013

【python】生成笛卡尔积(交叉表)DataFrame和numpy

有文件A:,B:,希望通过A,B生成C: 就是笛卡尔积操作。 一,当数据在numpy数组中,数据为:A=['a','b','c','d'] B=['1','2','3','4&...
  • w417950004
  • w417950004
  • 2017-11-03 17:39
  • 267

二叉树基本概念、二叉排序树、二叉平衡树与笛卡尔树

二叉树的定义二叉树 定义:是另一种树形结构,他的特点是每个结点之多只有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次数不能任意颠倒 性质:1.在二叉树的第i层上之多有2...
  • xiaojie_570
  • xiaojie_570
  • 2016-12-27 20:33
  • 332

笛卡尔树简介(分类到treap里面)

笛卡尔树结构由Vuillmin在解决范围搜索的几何数据结构问题时提出的,从数列中构造一棵笛卡尔树可以线性时间完成,需要采用基于栈的算法来找到在该数列中的所有最近小数。由此可知,笛卡尔树是一种特定的二叉...
  • u012350533
  • u012350533
  • 2013-11-22 00:27
  • 1065
    个人资料
    • 访问:312488次
    • 积分:7305
    • 等级:
    • 排名:第3542名
    • 原创:426篇
    • 转载:0篇
    • 译文:0篇
    • 评论:93条
    最新评论