萌新求助lct

P1501 [国家集训队] Tree II

@[UltiMadow](/user/65681) 比了下你代码和我AC代码的 `pushdown`、`update`以及其它函数, 大概没区别, 你可以找篇题解对着调, 也可以看看我的代码 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long const int maxn = 1e5 + 5; const int mod = 51061; int siz[maxn], val[maxn], sum[maxn], adtag[maxn], mltag[maxn]; int fa[maxn], ch[maxn][2]; bool c[maxn]; inline bool is(int x) { return ch[fa[x]][0]!=x && ch[fa[x]][1]!=x; } inline void ml(int x, int t) { mltag[x] *= t; adtag[x] *=t; mltag[x] %= mod; adtag[x] %= mod; sum[x] *= t; sum[x] %= mod; val[x] *= t; val[x] %= mod; } inline void ad(int x, int t) { adtag[x] += t; adtag[x] %= mod; sum[x] += siz[x] * t; sum[x] %= mod; val[x] += t; val[x] %= mod; } inline void rv(int x) { c[x]^=1; swap(ch[x][0], ch[x][1]); } inline void ps(int x) { if(mltag[x] != 1) { ml(ch[x][0], mltag[x]); ml(ch[x][1], mltag[x]); mltag[x] = 1; } if(adtag[x]) { ad(ch[x][0], adtag[x]); ad(ch[x][1], adtag[x]); adtag[x] = 0; } if(c[x]) { rv(ch[x][0]); rv(ch[x][1]); c[x]=0; } } inline void ud(int x) { sum[x] = (sum[ch[x][0]] + sum[ch[x][1]] + val[x]) % mod; siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1; } void ro(int x) { int y=fa[x], z=fa[y]; int sz = ch[z][1]==y; int sy = ch[y][1]==x; int sx = sy^1; int d = ch[x][sx]; if(!is(y)) ch[z][sz]=x; fa[x]=z; ch[x][sx]=y; fa[y]=x; ch[y][sy]=d; if(d) fa[d]=y; ud(y), ud(x); } void gx(int x) { if(!is(x)) gx(fa[x]); ps(x); } void sp(int x) { gx(x); while(!is(x)) { int y = fa[x]; if(!is(y)) { if(ch[fa[y]][1]==y ^ ch[y][1]==x) ro(x); else ro(y); } ro(x); } } void ac(int x) { int d = 0; while(x) { sp(x); ch[x][1] = d; ud(x); d=x; x=fa[x]; } } void mk(int x) { ac(x); sp(x); rv(x); } int fr(int x) { ac(x); sp(x); while(ch[x][0]) x=ch[x][0]; return x; } void lk(int x,int y) { mk(x); if(fr(y)!=x) fa[x]=y; } void ct(int x,int y) { mk(x); if(fr(y)==x && fa[x]==y && !ch[x][1]) { fa[x] = ch[y][0] = 0; ud(y); } } int n, q; signed main() { scanf("%lld%lld", &n, &q); for(int i=1; i<=n; ++i) val[i] = sum[i] = siz[i] = mltag[i] = 1; for(int i=1; i< n; ++i) { int x,y; scanf("%lld%lld", &x,&y); lk(x,y); } char op[4]; while(q--) { scanf("%s", op); if(op[0] == '+') { int u,v,c; scanf("%lld%lld%lld", &u, &v, &c); mk(u); ac(v); sp(v); ad(v, c); } else if(op[0] == '-') { int u1,v1,u2,v2; scanf("%lld%lld%lld%lld", &u1, &v1, &u2, &v2); ct(u1, v1); lk(u2, v2); } else if(op[0] == '*') { int u,v,c; scanf("%lld%lld%lld", &u, &v, &c); mk(u); ac(v); sp(v); ml(v, c); } else { int u, v; scanf("%lld%lld", &u, &v); mk(u); ac(v); sp(v); cout << sum[v]%mod << '\n'; } } return 0; } ```
by xwmwr @ 2020-04-30 08:37:27


WA or RE?
by ez_lcw @ 2020-04-30 08:38:48


~~说实话,调这种码农题必须得找个真人跟你一起调或者自己调~~
by ez_lcw @ 2020-04-30 08:40:30


@[ez_lcw](/user/118318) wa
by UltiMadow @ 2020-04-30 08:40:47


@[水比田昭寿](/user/118498) 蟹蟹
by UltiMadow @ 2020-04-30 08:41:03


@[UltiMadow](/user/65681) 道理我都懂,但你的代码空格为什么时有时无呢? 道理我都懂,但是你的 cut 为什么把x,y搞反了呢 ```cpp void ct(int x,int y) { mk(x); if(fr(y)==x && fa[y]==x && !ch[y][0]) { fa[y] = ch[x][1] = 0; ud(x); } } ``` 改后50pts 总之我再看看
by Lice @ 2020-04-30 09:07:59


@[_Wallace_](/user/61430) oooooh,蟹蟹 我马蜂比较奇怪/kk
by UltiMadow @ 2020-04-30 09:12:00


@[_Wallace_](/user/61430) 还有我的代码里写的不是 u 和 v 嘛,为啥是 x,y 啊(
by UltiMadow @ 2020-04-30 09:13:02


碰到这种奇怪的情况我直接重构/cy
by Marmota @ 2020-04-30 09:17:22


@[UltiMadow](/user/65681) 你的cut里面不是xy吗QAQ
by Lice @ 2020-04-30 09:18:06


| 下一页