这道题 我的想法和Qtree4/5的一样
是维护 Lmx 表示从splay中最浅的点出发能到达的最远的相同点距离。
rmx 表示从splay中最深的点出发能到达的最远的相同点距离
lc表示最浅的点的颜色
rc表示最深的点的颜色
sz表示splay的大小
那么pushup操作是这样的
inline void pushup(int p) {
if(!p) return ;
t[p].sz = t[ls(p)].sz + t[rs(p)].sz + 1;
if(ls(p)) t[p].lc = t[ls(p)].lc;
else t[p].lc = t[p].col;
if(rs(p)) t[p].rc = t[rs(p)].rc;
else t[p].rc = t[p].col;
if(t[ls(p)].lmx == t[ls(p)].sz && t[ls(p)].rc == t[p].col && t[p].col == t[rs(p)].lc) t[p].lmx = t[ls(p)].sz + 1 + t[rs(p)].lmx;
else if(t[ls(p)].lmx == t[ls(p)].sz && t[ls(p)].rc == t[p].col) t[p].lmx = t[ls(p)].sz + 1;
else t[p].lmx = t[ls(p)].lmx;
if(t[rs(p)].rmx == t[rs(p)].sz && t[rs(p)].lc == t[p].col && t[p].col == t[ls(p)].rc) t[p].rmx = t[rs(p)].sz + 1 + t[ls(p)].rmx;
else if(t[rs(p)].rmx == t[rs(p)].sz && t[rs(p)].lc == t[p].col) t[p].rmx = t[rs(p)].sz + 1;
else t[p].rmx = t[rs(p)].rmx;
t[p].ans = cnt[t[p].col][p] + 1;
if(t[p].col == t[ls(p)].rc) t[p].ans += t[ls(p)].rmx;
if(t[p].col == t[rs(p)].lc) t[p].ans += t[rs(p)].lmx;
}
过了样例,但是自己测试了几组,交到spoj上都挂了,请问是为什么?