void update(int i,int l,int r,int c)
{
if(tr[i].l==l&&tr[i].r==r)
{
tr[i].f=c;
int len=(tr[i].r-tr[i].l+1);
tr[i].hash1=fac[0][c][len];
tr[i].hash2=fac[1][c][len];
return ;
}
if(tr[i].f!=-1)
down(i);
int mid=(tr[i].l+tr[i].r)/2;
if(r<=mid)
{
update(i*2,l,r,c);
}
else if(l>mid)
{
update(i*2+1,l,r,c);
}
else
{
update(i*2,l,mid,c);
update(i*2+1,mid+1,r,c);
}
tr[i]=up(tr[i],tr[i*2],tr[i*2+1]);
}
Acm数据结构线段树中的update操作,用于更新节点信息
更新区间 和 当前节点的区间 容易混淆,曾经有个错是
将 int mid=(tr[i].l+tr[i].r)/2; 错写成
Int mid=(l+r)/2;
由于线段树内部过程不太直观,导致了难以查找的错误,最后还是反复的看代码,甚至对比正确的线段树代码来寻找问题。