老师有没有能动态为dp请求空间并可以实时释放空间的方法
毕竟不必每次都把一层猫树建出再查询
可以边建边查,但我不知道怎么动态释放空间
你线段树空间没复用吗?
线段树当然是重复使用的,
我借此已经优化了猫树logn的空间了
因为原本猫树每层都要存,现在只要一层就够,我可是让子节点直接把父节点的数据盖掉,才避免了层层都存
要不连32都没有
技穷了, 看看导师能看不 ![]()
有思路了
void build(int p,int l,int r,int d)
{
int mid=l+r>>1;
if(vis[p].size()!=0)
{
for(int i=mid+1;i<=r;i++)
{
ubuild(i,1,1,n);
if(i!=mid+1)
{
huo(i,i-1,1,1,n);
}
}
for(int i=mid;i>=l;i--)
{
ubuild(i,1,1,n);
if(i!=mid)
{
huo(i,i+1,1,1,n);
}
}
cxzy j;
for(int i=0;i<vis[p].size();i++)
{
j=vis[p][i];
ansb.reset();
uquery(vis[p][i].r1,1,vis[p][i].l2,vis[p][i].r2);
uquery(vis[p][i].l1,1,vis[p][i].l2,vis[p][i].r2);
ansb[0]=0;
vis[p][i].ans=ansb.count();
}
}
if(l==r)
{
return;
}
build(lc,l,mid,d+1);
build(rc,mid+1,r,d+1);
}
空间抱在这里,可以把
for(int i=0;i<vis[p].size();i++)
{
j=vis[p][i];
ansb.reset();
uquery(vis[p][i].r1,1,vis[p][i].l2,vis[p][i].r2);
uquery(vis[p][i].l1,1,vis[p][i].l2,vis[p][i].r2);
ansb[0]=0;
vis[p][i].ans=ansb.count();
}
和
for(int i=mid+1;i<=r;i++)
{
ubuild(i,1,1,n);
if(i!=mid+1)
{
huo(i,i-1,1,1,n);
}
}
for(int i=mid;i>=l;i--)
{
ubuild(i,1,1,n);
if(i!=mid)
{
huo(i,i+1,1,1,n);
}
}
合并,每次只存一个节点,每次判断有没有和该节点相关的访问。如有,进行更新
直接优化了n倍,但“每次判断有没有和该节点相关的访问”这一步要map,不知道会不会TLE
但愿不会

这个地方有没有可能把数字二进制离线下来或者结合map控制一下,最终用一个数组单独存储,确保相同数字一遍存储,一遍计算,因为这个地方转二进制应该会有大量的重复?嵌套开数组肯定是不行的 @王峥睿
那怎么可能。难道还把线段树上每个节点存一起吗
我可没听过这么高级的操作,估计也办不到
没事,已经有想法了
不是,我的意思是树归树存,也就是你那个bitset,存的话给树打标号就可以,每次操作索引更新一下,可能表述不太好,大概类比一下离线做法?这样的话可以把树的那一层N抠下来
你事先把询问离线下来就可以知道哪些操作在哪个时刻会动哪些节点,如果某个时刻不再动了那么哪个空间就没必要继续存了,按照你原本的存储就每棵树都强制在线了,所以肯定会超
其实要这么说你的方法和我的是一样的
我是把猫树的节点扣了