求助 本机能过 洛谷WA
查看原帖
求助 本机能过 洛谷WA
557800
luuia楼主2024/4/15 19:38

rt. 洛谷 IDE 跑样例出来是 0 2 3

#include<bits/stdc++.h>
using namespace std;

long long read()
{
    long long s = 0,w = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') w = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        s = (s << 1) + (s << 3) + (ch ^ 48);
        ch = getchar();
    }
    return s * w;
}

void write(long long a)
{
    if(a < 0) putchar('-'),a = -a;
    if(a > 9) write(a / 10);
    putchar(a % 10 + '0');
}

const int N = 1e6 + 10,inf = 2147483647;

long long n,a,x,y,z,opt;

struct FHQ
{

long long tot,root;
long long maxa[N],fa[N],val[N],dat[N],size[N],son[N][2];

void pushup(long long p)
{
    size[p] = size[son[p][0]] + size[son[p][1]] + 1;
    if(son[p][0]) fa[son[p][0]] = p;
    if(son[p][1]) fa[son[p][1]] = p;
    maxa[p] = max(maxa[son[p][0]],max(maxa[son[p][1]],val[p]));
}

void split_val(long long p,long long k,long long &x,long long &y)
{
    if(p == 0) {x = y = 0;return;}
    if(val[p] <= k) x = p,split_val(son[p][1],k,son[p][1],y);
    else y = p,split_val(son[p][0],k,x,son[p][0]);
    pushup(p);
}

void split_rank(long long p,long long k,long long &x,long long &y)
{
    if(p == 0) {x = y = 0;return;}
    if(size[son[p][0]] < k) x = p,split_rank(son[p][1],k - size[son[p][0]] - 1,son[p][1],y);
    else y = p,split_rank(son[p][0],k,x,son[p][0]);
    pushup(p);
}

long long merge(long long u,long long v)
{
    if(u == 0 || v == 0) return u + v;
    if(dat[u] < dat[v])
    {
        son[u][1] = merge(son[u][1],v);
        pushup(u);
        return u;
    }
    else
    {
        son[v][0] = merge(u,son[v][0]);
        pushup(v);
        return v;
    }
}

long long New(long long x)
{
    val[++tot] = maxa[tot] = maxa[x] + 1,size[tot] = 1,dat[tot] = rand();
    return tot;
}

void insert(long long a)
{
    split_val(root,a,x,y);
    root = merge(merge(x,New(x)),y);
}

void remove1(long long a) // 删除所有点
{
    split_val(root,a,x,z);
    split_val(x,a - 1,x,y);
    root = merge(x,z);
}

void remove2(long long a) // 删除某一点
{
    split_val(root,a,x,z);
    split_val(x,a - 1,x,y);
    y = merge(son[y][0],son[y][1]);
    root = merge(merge(x,y),z);
}

long long get_node(long long p,long long k)
{
    while(1)
    {
        if(k <= size[son[p][0]]) p = son[p][0];
        else if(k == size[son[p][0]] + 1) return p;
        else k -= size[son[p][0]] + 1,p = son[p][1];
    }
}

long long get_val(long long p,long long k){return val[get_node(p,k)];}

long long get_rank(long long a)
{
    split_val(root,a - 1,x,y);
    long long k = size[x] + 1;
    root = merge(x,y);
    return k;
}

long long get_pos(long long p)
{
    long long res = size[son[p][0]] + 1;
    while(fa[p])
    {
        if(p == son[fa[p]][1]) res += size[son[fa[p]][0]] + 1;
        p = fa[p];
    }
    return res;
}

long long get_pre(long long a)
{
    split_val(root,a - 1,x,y);
    long long tmp = get_val(x,size[x]);
    root = merge(x,y);
    return tmp;
}

long long get_next(long long a)
{
    split_val(root,a,x,y);
    long long tmp = get_val(y,1);
    root = merge(x,y);
    return tmp;
}

}tree;

int main()
{
    // freopen("input.in","r",stdin);
    n = read();
    while(n--)
    {
        a = read();
        tree.insert(a);
        write(tree.maxa[tree.root]),putchar('\n');
    }
    return 0;
}
2024/4/15 19:38
加载中...