⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poj1769_线段树.cpp

📁 本人最近在acm.pku.edu.cn上通过的程序
💻 CPP
字号:
#include <stdio.h>
#define MAX 50000
 
int Len;
struct TNode {
    int left, right;
    int minstep;
    TNode *LeftChild, *RightChild;
    void Construct(int, int);
    void Insert(int, int);
    int GetRank(int, int);
} STree [MAX * 2 + 2], *Root = &STree [0];

int N, M; 

void TNode::Construct(int l, int r){
    left = l; right = r; minstep = 999999;
    if(l == r) { LeftChild = NULL; RightChild = NULL; return; }
    int mid =(l + r) >> 1;
    LeftChild = &STree [Len ++];
    RightChild = &STree [Len ++];
    LeftChild->Construct(l, mid);
    RightChild->Construct(mid + 1, r);
}

void TNode::Insert(int p, int x){
    if(x < minstep) minstep = x;
    if(left == right) return;
    if(p <=(left + right) >> 1) LeftChild->Insert(p, x);
    else RightChild->Insert(p, x);
}

int TNode::GetRank(int l, int r){
    if(l == left && r == right) return minstep;
    int mid =(left + right) >> 1;
    if(r <= mid) return LeftChild->GetRank(l, r);
    if(l > mid) return RightChild->GetRank(l, r);
    int ret1, ret2;
    ret1 = LeftChild->GetRank(l, mid);
    ret2 = RightChild->GetRank(mid + 1, r);
    return ret1 < ret2 ? ret1 : ret2;
}

int	main(){
    int i, a, b, p;
    while(scanf("%d %d", &N, &M) != EOF) {
        Len = 1; Root->Construct(1, N);
        Root->Insert(1, 0);
        for(i = 0; i < M; i++) {
            scanf("%d%d", &a, &b);
            if(a < b) {
                p = Root->GetRank(a, b - 1);
                Root->Insert(b, p + 1);
            }
        } 
        printf("%d\n", Root->GetRank(N, N));
    }
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -