调了两小时哩
查看原帖
调了两小时哩
1036693
carp_oier楼主2023/10/30 22:27

真的这个题目找不到任何挂点,但是就是挂了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define fom(i, a) for(int i=a; i; -- i)
#define foa(i, a, b) for(int i=a; i < b; ++ i)
#define fos(i, a, b) for(int i=a; i <= b; ++ i)
#define fop(i, a, b) for(int i=a; i >= b; -- i)
#define ws putchar(' ')
#define wl putchar('\n')

template <class T> void waw(T x)
{
    if(x > 9) waw(x / 10);
    putchar(x % 10 ^ 48);
}

template <class T> inline void ww(T x)
{
    if(x < 0) x = ~x + 1, putchar('-');
    waw(x);
}

template <class T> inline void read(T &res)
{
    char ch = getchar(); bool f = 0; res = 0;
    for(; !isdigit(ch); ch = getchar()) f |= ch == '-';
    for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
    res = f ? ~res + 1 : res;
}

const ll N = 1e5 + 10, INF = 1e18;

ll n, idx, root;

struct node { ll id, v; bool operator <(const node &x) const { return (v == x.v) ? id < x.id : v < x.v; } } a[N];

struct Splay
{
    ll s[2], v, p, size, lz;
    inline void init(ll _v, ll _p) { v = _v, p = _p, size = 1, lz = 0; }
}tr[N];

#define fa(x) tr[x].p
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]

inline bool get(ll x) { return rs(fa(x)) == x; }
inline void pushup(ll u) { tr[u].size = tr[ls(u)].size + tr[rs(u)].size + 1; }

inline  void pushdown(ll u)
{
    if(!tr[u].lz) return ;
    swap(ls(u), rs(u)); 
    if(ls(u)) tr[ls(u)].lz ^= 1;
    if(rs(u)) tr[rs(u)].lz ^= 1;
    tr[u].lz = 0;
}

inline ll build(ll l, ll r, ll p)
{
    ll u = ++ idx, mid = l + r >> 1;
    tr[u].init(a[mid].v, p);
    if(l < mid) ls(u) = build(l, mid - 1, u);
    if(mid < r) rs(u) = build(mid + 1, r, u);
    pushup(u); return u;
}

inline void rotate(ll x)
{
    ll y = fa(x), z = fa(y); bool c = get(x); pushdown(z), pushdown(y), pushdown(x);
    fa(tr[x].s[c ^ 1]) = y, tr[y].s[c] = tr[x].s[c ^ 1], tr[x].s[c ^ 1] = y, fa(y) = x, fa(x) = z;
    if(z) tr[z].s[y == rs(z)] = x;
    pushup(y), pushup(x);
}

inline void splay(ll x, ll y)
{
    for(rl f = fa(x); f = fa(x), f != y; rotate(x))
        if(fa(f) != y) rotate(get(f) == get(x) ? f : x);
    if(!y) root = x;
}

inline ll get_k(ll k)
{
    ll u = root;
    while(u)
    {
        pushdown(u);
        ll sz = tr[ls(u)].size + 1;
        if(sz > k) u = ls(u);
        else if(sz == k) return u;
        else k -= sz, u = rs(u);
    }

    return -1;
}

inline void print(ll u)
{
    if(ls(u)) print(ls(u));
    printf("u : %lld v : %lld ", u, tr[u].v);
    if(rs(u)) print(rs(u));
}

int main()
{
    read(n);

    a[0] = { -INF, 0 }, a[n + 1] = { INF, n + 1 };

    fos(i, 1, n) read(a[i].v), a[i].id = i;

    sort(a + 1, a + 1 + n);

    root = build(0, n + 1, 0);

    foa(i, 1, n)
    {
        pushdown(root);
        splay(a[i].id + 1, 0);
        ll s = tr[ls(root)].size;
        ww(s), ws;
        ll l = get_k(i), r = get_k(s + 2);
        splay(l, 0), splay(r, l);
        tr[ls(r)].lz ^= 1;
    }

    ww(n), wl;
    return 0;
}
2023/10/30 22:27
加载中...