如果你 WA on 48
检查你的枚举询问
你可能是使用两个指针 l,r 表示 i∼l 的区间内的边权相同,并且 l∼r 区间的询问相同。
注意的是如果你 l∼r 的区间询问相同不一定代表 i∼l 的区间边权一样。
你要在第二层while里面特判
for(int i=1,l,r;i<=cnt;i)
{
l=i;
while(val[d[i].k]==val[d[l].k])
{
r=l;
while(d[l].id==d[r].id)
{
if(val[d[l].k]!=val[d[r].k])break;
}
}
i=l;
}
如果你TLE了,可以试试按秩合并的深度合并,size合并可能比较慢。