以下这段代码为何RE```#include<bits/stdc++.h> using namespace std; const int mx=1e5+1; int n,Q,x,y,d[mx],fa[mx],siz[mx],ev[mx],a[mx],son[mx],dfn[mx],cnt,id[mx],top[mx],ans[mx]; struct edge{int c,w,id,u,v;}e[mx*2]; struct que{int u,v,x,y;}q[mx*2]; struct tree{int l,r,lzy1,lzy2;}t[mx*4]; vector<edge> v[mx]; vector<int> es[mx]; vector<int> qs[mx]; //以下树剖 void dfs1(int f,int u) { d[u]=d[f]+1,fa[u]=f,siz[u]=1; int len=v[u].size(); for(int i=0;i<len;i++) { edge next=v[u][i]; int nv=next.v; if(nv==f) continue; ev[next.id]=nv,a[nv]=next.w; dfs1(u,nv); siz[u]+=siz[nv]; if(siz[nv]>siz[son[u]]) son[u]=nv; } } void dfs2(int f,int u) { dfn[u]=++cnt,id[cnt]=u,top[u]=f; if(son[u]) dfs2(f,son[u]); int len=v[u].size(); for(int i=0;i<len;i++) { int nv=v[u][i].v; if(nv==fa[u] || nv==son[u]) continue; dfs2(nv,nv); } } //以上树剖 //以下线段树 void pushup1(int x){t[x].lzy1=t[x<<1].lzy1+t[x<<1|1].lzy1;} void pushup2(int x){t[x].lzy2=t[x<<1].lzy2+t[x<<1|1].lzy2;} void build(int x,int l,int r) { t[x].l=l,t[x].r=r; if(l==r) { t[x].lzy1=a[id[l]],t[x].lzy2=0; return; } int mid=(l+r)/2; build(x<<1,l,mid);build(x<<1|1,mid+1,r); pushup1(x); } void chang1(int x,int obx,int w) { if(t[x].l==t[x].r){t[x].lzy1=w;return;} int mid=(t[x].l+t[x].r)>>1; if(obx<=mid) chang1(x<<1,obx,w); else chang1(x<<1|1,obx,w); pushup1(x); } void chang2(int x,int obx,int w) { if(t[x].l==t[x].r){t[x].lzy2=w;return;} int mid=(t[x].l+t[x].r)>>1; if(obx<=mid) chang2(x<<1,obx,w); else chang2(x<<1|1,obx,w); pushup2(x); } int find1(int x,int l,int r) { if(l<=t[x].l && r>=t[x].r) return t[x].lzy1; int mid=(l+r)>>1,s=0; if(l<=mid) s+=find1(x<<1,l,r); if(r>mid) s+=find1(x<<1|1,l,r); return s; } int find2(int x,int l,int r) { if(l<=t[x].l && r>=t[x].r) return t[x].lzy2; int mid=(l+r)>>1,s=0; if(l<=mid) s+=find2(x<<1,l,r); if(r>mid) s+=find2(x<<1|1,l,r); return s; } //以上线段树 int fans(int x,int y,int k) { int ans=0; while(top[x]!=top[y]) { if(d[top[x]]<d[top[y]]) swap(x,y); ans+=find1(1,dfn[top[x]],dfn[x]); ans+=find2(1,dfn[top[x]],dfn[x]); x=fa[top[x]]; } if(d[x]>d[y]) swap(x,y); if(x!=y) { ans+=find1(1,dfn[x]+1,dfn[y]); ans+=k*find2(1,dfn[x]+1,dfn[y]); } return ans; } int main() { cin >> n >> Q; for(int i=1;i<n;i++) { cin >> e[i].u >> e[i].v >> e[i].c >> e[i].w; e[i].id=i; v[e[i].u].push_back({e[i].u,e[i].v,e[i].c,e[i].w,e[i].id}); v[e[i].v].push_back({e[i].v,e[i].u,e[i].c,e[i].w,e[i].id}); es[e[i].c].push_back(i); } for(int i=1;i<=Q;i++) { cin >> q[i].x >> q[i].y >> q[i].u >> q[i].v; qs[q[i].x].push_back(i); } dfs1(1,1);dfs2(1,1);build(1,1,n); for(int i=1;i<n;i++) { int len=es[i].size(); for(int j=0;j<len;j++) { int k=ev[es[i][j]]; find1(1,dfn[k],0); find2(1,dfn[k],1); } for(int j=0;j<len;j++) { int k=qs[i][j]; ans[k]=fans(q[k].u,q[k].v,q[k].y); } for(int j=0;j<len;j++) { int k=ev[es[i][j]]; find1(1,dfn[k],e[es[i][j]].w); find2(1,dfn[k],0); } } for(int i=1;i<=Q;i++) cout<<ans[i]<<"\n"; return 0; }``
时间: 2023-11-25 11:06:15 浏览: 163
这段代码出现 RE 错误,是因为在函数 `find1` 和 `find2` 中,递归调用时没有正确处理左右子树的区间边界。在 `find1` 和 `find2` 函数中,需要将左子树的区间边界更新为 `mid`,右子树的区间边界更新为 `mid+1`。你可以按照以下方式修改代码:
```cpp
int find1(int x, int l, int r)
{
if (l <= t[x].l && r >= t[x].r)
return t[x].lzy1;
int mid = (t[x].l + t[x].r) >> 1;
int s = 0;
if (l <= mid)
s += find1(x << 1, l, r);
if (r > mid)
s += find1(x << 1 | 1, l, r);
return s;
}
int find2(int x, int l, int r)
{
if (l <= t[x].l && r >= t[x].r)
return t[x].lzy2;
int mid = (t[x].l + t[x].r) >> 1;
int s = 0;
if (l <= mid)
s += find2(x << 1, l, r);
if (r > mid)
s += find2(x << 1 | 1, l, r);
return s;
}
```
修复后的代码应该可以正常运行了。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)