Rinne Loves Data Structure

Rinne Loves Data Structure

https://ac.nowcoder.com/acm/problem/22596

Rinne Loves Data Structure

思路

我们插入的位置大概分了四种:
第一种
图片说明

显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值。
第二种
图片说明

我们只要找到当前节点的suc,也就是比当前节点小的,最大值。

第三种
图片说明

我们只要找到当前节点的suc,也就是比当前节点小的,最大值。

第四种

图片说明

显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值。

综上,一,三我们可以直接去
第二种是没有的,我们也可以直接特判,得到它的,更新
第四种是没有的,我们可以直接特判,然后得到它的,所以

插入第一个元素的时候我们既没有前驱,也没有后驱,需要单独考虑。

最后加一个相同值的判定,这道题目没有明确说明是否这n个数都是不一样的。

代码

/*
  Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;

inline ll read() {
  ll f = 1, x = 0;
  char c = getchar();
  while(c < '0' || c > '9') {
    if(c == '-')    f = -1;
    c = getchar();
  }
  while(c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  return f * x;
}

void print(ll x) {
  if(x < 10) {
    putchar(x + 48);
    return ;
  }
  print(x / 10);
  putchar(x % 10 + 48);
}

const int N = 3e5 + 10;

int dep[N], n;

set<int> st;

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n = read();
    ll ans = 0;
    while(n--) {
        int x = read();
        if(st.size() == 0) {
            puts("0");
            st.insert(x);
            continue;
        }
        // auto p = lower_bound(st.begin(), st.end(), x);
        //用这个给tle了,不懂原理。
        auto p = st.lower_bound(x);
        if(*p == x) {
            printf("%lld\n", ans);
            continue;
        }
        if(p == st.begin()) {
            dep[x] = dep[*p] + 1;
            ans += dep[x];
        }
        else if(p == st.end()) {
            p--;
            dep[x] = dep[*p] + 1;
            ans += dep[x];
        }
        else {
            dep[x] = dep[*p] + 1;
            p--;
            dep[x] = max(dep[x], dep[*p] + 1);
            ans += dep[x];
        }
        st.insert(x);
        printf("%lld\n", ans);
    }
    return 0;
}
全部评论
确实是,这道题目没有明确标明是否会有相同值的插入,所以我们应该要考虑这种情况,多谢大佬的指正,已修改O(∩_∩)O
点赞 回复 分享
发布于 2020-07-21 20:44
存在BUG把,平衡二叉树值相同应该不插入,题目代码if写了,居然没用这个测试点,应该要加个特判,膜拜大佬orz
点赞 回复 分享
发布于 2020-07-21 18:44

相关推荐

06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 17:30
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务