90分代码的pushup:
ma:区间最大值
se:区间严格最大值
t:区间最大值个数
hma:区间历史最大值的最大值
void pushup(int p)
{
if(tr[p].l == tr[p].r) return;
tr[p].sum = tr[p << 1].sum + tr[p << 1 | 1].sum;
if(tr[p << 1].ma > tr[p << 1 | 1].ma)
{
tr[p].ma = tr[p << 1].ma, tr[p].t = tr[p << 1].t;
tr[p].se = max(tr[p << 1].se, tr[p << 1 | 1].ma);
}
else if(tr[p << 1].ma == tr[p << 1 | 1].ma)
{
tr[p].ma = tr[p << 1].ma, tr[p].t = tr[p << 1].t + tr[p << 1 | 1].t;
tr[p].se = max(tr[p << 1].se, tr[p << 1 | 1].se);
}
else
{
tr[p].ma = tr[p << 1 | 1].ma, tr[p].t = tr[p << 1 | 1].t;
tr[p].se = max(tr[p << 1].ma, tr[p << 1 | 1].se);
}
tr[p].hma = max(tr[p].hma, tr[p].ma);
}
100分代码的pushup:
void pushup(int p)
{
if(tr[p].l == tr[p].r) return;
tr[p].sum = tr[p << 1].sum + tr[p << 1 | 1].sum;
tr[p].hma = max(tr[p << 1].hma, tr[p << 1 | 1].hma);
if(tr[p << 1].ma > tr[p << 1 | 1].ma)
{
tr[p].ma = tr[p << 1].ma, tr[p].t = tr[p << 1].t;
tr[p].se = max(tr[p << 1].se, tr[p << 1 | 1].ma);
}
else if(tr[p << 1].ma == tr[p << 1 | 1].ma)
{
tr[p].ma = tr[p << 1].ma, tr[p].t = tr[p << 1].t + tr[p << 1 | 1].t;
tr[p].se = max(tr[p << 1].se, tr[p << 1 | 1].se);
}
else
{
tr[p].ma = tr[p << 1 | 1].ma, tr[p].t = tr[p << 1 | 1].t;
tr[p].se = max(tr[p << 1].ma, tr[p << 1 | 1].se);
}
}