Qtree6的另类解法(可能有人写过) 大佬们能不能康康 为什么错?
  • 板块学术版
  • 楼主ZXY99
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/16 17:33
  • 上次更新2023/11/6 20:07:10
查看原帖
Qtree6的另类解法(可能有人写过) 大佬们能不能康康 为什么错?
138356
ZXY99楼主2020/8/16 17:33

这道题 我的想法和Qtree4/5\text{Qtree4/5}的一样

是维护 LmxLmx 表示从splaysplay中最浅的点出发能到达的最远的相同点距离。

rmxrmx 表示从splaysplay中最深的点出发能到达的最远的相同点距离

lclc表示最浅的点的颜色

rcrc表示最深的点的颜色

szsz表示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上都挂了,请问是为什么?

整个代码

2020/8/16 17:33
加载中...