- 月赛
- 2017-08-25 12:59:45 @
2
36 条评论
-
lemonoil LV 9 @ 2017-08-26 15:51:11
我又回来了!!@@!!
-
2017-08-26 15:34:58@
那你自己看看代码%%%%%%
-
2017-08-26 15:32:33@
马上 我又被拉出去了
-
2017-08-26 15:31:42@
其实是一个道理,f[i][j]也是这样啊
-
2017-08-26 15:29:19@
所以要两个dfs 接下来就是f【i】【j】有什么用对吧
-
2017-08-26 15:28:32@
所以先得到自己儿子的所有F[i]值,再得到自己上面的F[i]值,这两者没办法同时进行
-
2017-08-26 15:27:35@
因为此时u的上面的点的F[i]都是0,没办法用上面更新下面
-
2017-08-26 15:26:43@
那么对于你要更新F[i],最简单也是必要的就是先统计自己son的F[j]
-
2017-08-26 15:25:04@
打个比方,对于以u为根来说,一共有三部分组成,一个是u,一个是u的上面,一个就是u的son组成的集合
-
2017-08-26 15:22:42@
即记录时自己的儿子的值应该先返回给自己,因为,必须知道所有的小辈部分的F[i]才能去为小辈更新他们的f[i][j]
-
2017-08-26 15:19:45@
不是很好讲,因为dfs1与dfs2的关系不是并列的
-
2017-08-26 15:18:55@
这里的方法就有点生涩了、、
-
2017-08-26 15:15:35@
这两者先后看似没有顺序,但是如果放在一起处理就会出事故、
-
2017-08-26 15:13:14@
只处理fa到i的情况肯定不行,只处理i到fa的情况也不行
-
2017-08-26 15:12:40@
回顾本题,这道题中指的是任意道路
-
2017-08-26 15:12:08@
与刚刚的先处理儿子在处理fa相反,所以这一次先处理fa在处理儿子
-
2017-08-26 15:11:20@
寓意就是fa[i]处理完了在来处理i
-
2017-08-26 15:10:54@
这次的dfs在处理下方
-
2017-08-26 15:10:39@
v=e[i].v; if(v==p)continue; int temp=F[x]-F[v]-e[i].len/M; for(j=0;j<M;j++){ k=j+e[i].len; temp-=k/M*f[v][j]; g[k%M]=f[x][k%M]-f[v][j]; } g[e[i].len%M]--; F[v]+=temp+e[i].len/M; f[v][e[i].len%M]++; for(j=0;j<M;j++){ k=j+e[i].len; F[v]+=k/M*g[j]; f[v][k%M]+=g[j]; } dfs2(v,x);
-
2017-08-26 15:10:25@
所以要第二次dfs
-
2017-08-26 15:09:59@
之后就是这样做完了为什么还要一次dfs对吧
-
2017-08-26 15:09:44@
我有一个疑惑的地方,因为第一次我是用dfs(1, 0),把1作为根来去遍历它的儿子,然后用儿子更新根,好像并没有把根的值去更新儿子?
-
2017-08-26 15:09:25@
公式原因我就不讲了。。
-
2017-08-26 15:08:55@
我们用它儿子的值即F[i(v)]去更新它的值F[fai],公式就是,F[x]+=F[v]+len(就是x与v的边长)/M(mod)
-
2017-08-26 15:06:26@
x为当前点,v为它的儿子,
-
2017-08-26 15:04:51@
对于i的father fa[i],来说,他的每一个儿子都可以对他本身的值产生贡献,所以这一次dfs为的是
cpp
F[x]+=F[v]+e[i].len/M;
f[x][e[i].len%M]++;
for(j=0;j<M;j++){
k=j+e[i].len;
F[x]+=k/M*f[v][j];
f[x][k%M]+=f[v][j];
}
-
2017-08-26 15:00:48@
或者这么说:f[i][j]可以对f[fa[i]][(j+len)/mod]+f[fa[i]][(j+len)%len]产生贡献
-
2017-08-26 14:58:01@
然后f[i][j]可以拆成f[i][(j+len)/mod]+f[i][(j+len)%len].
-
2017-08-26 14:55:49@
刚刚有事不好意思
-
2017-08-26 14:53:10@
求出了f[i][(j+len)%mod]
-
2017-08-26 14:52:11@
因为我们一开始定义的是这样:F[i]表示以i为根的和,然后f[i][j]就比较奇妙了,
-
2017-08-26 14:50:39@
接着 dfs1是计算f[i][(j+len)%mod]的值
-
2017-08-26 14:49:39@
我们考虑暴力计算mod的情况,因为mod很小,可以直接枚举。
-
2017-08-26 14:48:42@
是这样的
-
2017-08-26 14:45:52@
@????
好吧 @A 恩知道没用还是搞搞 -
2017-08-25 15:03:30@
dis(u, v)是题目中给的len吗
- 1