真的这个题目找不到任何挂点,但是就是挂了。
#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;
}