GalaxyOJ-1003 (好题+STL)

题目


http://www.gdfzoj.com/oj/contest/248/problems/1
题面
数据范围

分析

  • 哇,这个题虽然是放在 提高 B 组 第一题,可是却一脸懵逼。
  • 结束后听 ZW 半分钟讲了这题,恍然大悟……
  • 这是样例画出的查找树(水平方向按数值排好顺序)
  • 图1
  • 图2
  • 自己模拟一下,会发现,新加入一个数后,找到它(以水平向坐标为标准)左右两个点,那么它的深度就是左右深度较大值的下一层。
  • 用个 set 记录节点信息(数值和深度),每次找左右两个节点,操作一下即可,刚好练一练 STL。
  • 关于边界的细节可以看看程序。

程序

#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
typedef pair<int,int> pr;
int n,x,k;
long long ans;
set <pr> S;
set <pr>::iterator it;
pr l,r;

int main(){
    scanf("%d",&n);
    while (scanf("%d",&x)!=EOF){
        it=S.lower_bound((pr){x,0});
        if (it!=S.end()) r=*it;
            else r=(pr){-1,-1};
        if (it==S.begin()) l=(pr){-1,-1};
            else {it--; l=*it;}
        k=max(l.second,r.second)+1;
        S.insert((pr){x,k});
        printf("%lld\n",ans+=k);
    }
}

提示

  • 这题值得积累……

猜你喜欢

转载自blog.csdn.net/jackypigpig/article/details/78471207