国际惯例的题面:

代价理解为重心和每个点这个点对的代价。根据期望的线性性,我们枚举每个点,计算会产生的ij点对的代价即可。
那么,i到j的链上,i必须是第一个被选择的点。
对于i来说,就是1/dis(i,j)。
所以答案就是sigma(i,j) 1/(dis(i,j)+1)。
然而这样计算是n^2的,考虑优化。
如果我们能计算出边长为某个数值的边的数量的话,是不是就能计算答案呢?
统计路径的题,一眼点分治。
考虑怎样计算,我们能dfs出每个子树中距离分治重心为x的点有多少个,然后我们枚举两个点让他们取去组成路径即可。
这显然是个卷积,FFT优化。我们补集转化,先计算全部方案,再减去本身对本身(两个点来自相同子树)的方案。
为什么这样算复杂度正确?因为当当前分治层数一定时,所有子树的最深点的深度总和是O(n)的,并且那个log还会更小。这样分析的话发现复杂度是O(nlog^2n)。
正常的二元关系计算方式是前缀和和当前的卷积贡献,为什么这次不能这样呢?
给你一棵扫把形的树,一半的点形成一条链,显然你会选择扫把的重心(一边是一堆叶子,一边是链)当做重心。
然后你发现链的那边长度为n/2,如果你对每个叶子都和链做一次卷积的话,恭喜你卡成n^2logn,不如暴力......

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 const int maxn=262145;
 6 const int inf=0x3f3f3f3f;
 7 const double pi = acos(-1.0);
 8
 9 int tim[maxn];
10
11 namespace FFT {
12     struct Complex {
13         double r,i;
14         friend Complex operator + (const Complex &a,const Complex &b) { return (Complex){a.r+b.r,a.i+b.i}; }
15         friend Complex operator - (const Complex &a,const Complex &b) { return (Complex){a.r-b.r,a.i-b.i}; }
16         friend Complex operator * (const Complex &a,const Complex &b) { return (Complex){a.r*b.r-a.i*b.i,a.r*b.i+a.i*b.r}; }
17     }cp[maxn];
18     inline void FFT(Complex* dst,int n,int tpe) {
19         for(int i=0,j=0;i<n;i++) {
20             if( i < j ) std::swap(dst[i],dst[j]);
21             for(int t=n>>1;(j^=t)<t;t>>=1) ;
22         }
23         for(int len=2;len<=n;len<<=1) {
24             const int h = len >> 1;
25             const Complex per = (Complex){cos(pi*tpe/h),sin(pi*tpe/h)};
26             for(int st=0;st<n;st+=len) {
27                 Complex w = (Complex){1.0,0.0};
28                 for(int pos=0;pos<h;pos++) {
29                     const Complex u = dst[st+pos] , v = dst[st+pos+h] * w;
30                     dst[st+pos] = u + v , dst[st+pos+h] = u - v , w = w * per;
31                 }
32             }
33         }
34         if( !~tpe ) for(int i=0;i<n;i++) dst[i].r /= n;
35     }
36     inline void mul(int* dst,int n) {
37         int len = 1;
38         while( len <= ( n << 1 ) ) len <<= 1;
39         for(int i=0;i<len;i++) cp[i] = (Complex){(double)dst[i],0.0};
40         FFT(cp,len,1);
41         for(int i=0;i<len;i++) cp[i] = cp[i] * cp[i];
42         FFT(cp,len,-1);
43         for(int i=0;i<len;i++) dst[i] = (int)(cp[i].r+0.5);
44     }
45 }
46
47 namespace Tree {
48     int s[maxn],t[maxn<<1],nxt[maxn<<1];
49     int siz[maxn],mxs[maxn],ban[maxn];
50     int su[maxn],tp[maxn];
51
52     inline void addedge(int from,int to) {
53         static int cnt = 0;
54         t[++cnt] = to , nxt[cnt] = s[from] , s[from] = cnt;
55     }
56     inline void findroot(int pos,int fa,const int &fs,int &rt) {
57         siz[pos] = 1 , mxs[pos] = 0;
58         for(int at=s[pos];at;at=nxt[at]) if( t[at] != fa && !ban[t[at]] ) findroot(t[at],pos,fs,rt) , siz[pos] += siz[t[at]] , mxs[pos] = std::max( mxs[pos] , siz[t[at]] );
59         if( ( mxs[pos] = std::max( mxs[pos] , fs - siz[pos]) ) <= mxs[rt] ) rt = pos;
60     }
61     inline void dfs(int pos,int fa,int dep,int &mxd) {
62         mxd = std::max( mxd , dep ) , ++tp[dep];
63         for(int at=s[pos];at;at=nxt[at]) if( t[at] != fa && !ban[t[at]] ) dfs(t[at],pos,dep+1,mxd);
64     }
65     inline void solve(int pos,int fs) {
66         int root = 0 , mxd = 0 , ths ;
67         *mxs = inf, findroot(pos,-1,fs,root) , ban[root] = 1;
68         for(int at=s[root];at;at=nxt[at]) if( !ban[t[at]]) {
69             ths = 0 , dfs(t[at],root,1,ths) , mxd = std::max( mxd , ths );
70             for(int i=1;i<=ths;i++) su[i] += tp[i];
71             FFT::mul(tp,ths);
72             for(int i=1;i<=ths<<1;i++) tim[i] -= tp[i];
73             memset(tp,0,sizeof(int)*(ths<<1|1));
74         }
75         ++*su , FFT::mul(su,mxd);
76         for(int i=1;i<=mxd<<1;i++) tim[i] += su[i];
77         memset(su,0,sizeof(int)*(mxd<<1|1));
78         for(int at=s[root];at;at=nxt[at]) if( !ban[t[at]] ) solve(t[at],siz[t[at]]<siz[root]?siz[t[at]]:fs-siz[root]);
79     }
80 }
81
82 int main() {
83     static int n;
84     static long double ans;
85     scanf("%d",&n);
86     for(int i=1,a,b;i<n;i++) scanf("%d%d",&a,&b) , ++a , ++b , Tree::addedge(a,b) , Tree::addedge(b,a);
87     Tree::solve(1,n) , ans = n;
88     for(int i=1;i<=n<<1;i++) ans += (long double) tim[i] / ( i + 1 );
89     printf("%0.4Lf\n",ans);
90     return 0;
91 }

View Code

ここでこのまま
即使在这里就这样
僕が消えてしまっても 誰も知らずに
我消失不见了 谁也不会知道吧
明日が来るのだろう
明天依然会来临吧
わずか 世界のひとかけらに過ぎない
我仅仅是 这个世界的微小碎屑
ひとりを夜が包む
夜晚怀抱孤独的身影

转载于:https://www.cnblogs.com/Cmd2001/p/8969717.html

3451: Tyvj1953 Normal 点分治 FFT相关推荐

  1. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

  2. 【学习笔记】分治FFT

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 分治FFT 1. Luogu P4721 [模板]分治 FFT 2. 2020 ICPC Mac ...

  3. 2020 ICPC Macau A. Accelerator(期望,计数,分治FFT)(每日一题 21.7.6)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2020 ICPC Macau A. Accelerator(分治FFT) Problem 给定长度为 ...

  4. [洛谷P4721]【模板】分治 FFT

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$ f_i=\sum_{j=1}^if_{i-j}g_j\\ f_0=1 $$ 题解:直接求复杂度是$O ...

  5. [分治FFT]「CTSC2018」青蕈领主

    题目梗概 定义一个序列是连续的,当且仅当这个序列的最大值-最小值不超过序列长度-1. 现在有一个长度为\(n\)的排列,给出以每个位置为右端点的最长连续区间的长度,求满足的排列的方案数. 解题思路 如 ...

  6. 洛谷 - P4721 【模板】分治 FFT(分治NTT)

    题目链接:点击查看 题目大意:给出序列 g1,⋯,ng_{1,\cdots,n}g1,⋯,n​,求 f0,⋯,nf_{0,\cdots,n}f0,⋯,n​ 规定 fi=∑j=1ifi−jgjf_i=\ ...

  7. HDU5322 - cdq分治FFT加速dp

    5322 Hope [CDQ分治FFT加速计算dp] 题意 每一个每一个排列,排列中每个数向它后面第一个比它大的数连一条边. 每个排列对于答案的贡献是这个排列所生成的图中的每一个联通量中点的个数的平方 ...

  8. 【牛客 - 157F】三轮(dp,分治fft)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/F 来源:牛客网 小k有一个三轮,它最多可以装105大小的东西 小k有n种商品,他要准备出摊了 每种商品体 ...

  9. FTT NTT 分治FFT

    FFT study from: http://www.orchidany.cf/2019/02/19/FFT1/ https://www.cnblogs.com/zwfymqz/p/8244902.h ...

最新文章

  1. call_user_func() expects parameter 1 to be a valid callback, cannot access private method
  2. [LeetCode]Longest Palindromic Substring题解(动态规划)
  3. PHP通过header实现文本文件的下载
  4. C语言课程设计选哪个,C语言课程设计选题及要求.docx
  5. 车载wince系统刷界面ui_2020年值得关注的10个UI设计趋势!
  6. 【Linux】一步一步学Linux——date命令(81)
  7. UJAM Finisher FLUXX for Mac(综合效果器插件)
  8. 【信号处理】采样定理的深入浅出
  9. Linux下安装JDK常用命令
  10. 360修复上不了网络连接服务器失败,360断网急救箱网络连接配置修复不了怎么办-修复不了的解决办法...
  11. qq登录界面句柄_天天玩QQ!知道登录界面那两个人是谁吗?网友:不是情侣?...
  12. 打造海报视觉效果—利用图层模式调色
  13. springboot集成Swagger3.0
  14. Django创建APP
  15. Octave4.4.1-64位下载
  16. PKUWC2019垫底记
  17. NYOJ2347---LYQの字符串(技巧题:应该是滑动窗)
  18. 利用html加css以及JavaScript写一个学生后台管理系统简单平台
  19. continue / break 跳出指定层循环
  20. 2022中国济南国际养老服务业博览会

热门文章

  1. Unity FixedUpdate 与 Update 的线程关系实验
  2. [LeetCode]--160. Intersection of Two Linked Lists
  3. linux find 命令详解
  4. Hadoop系列四:Hadoop之Hive篇
  5. Unicode——Windows核心编程学习手札之二
  6. Pandas简明教程:五、Pandas简单统计操作及通用方式
  7. Pandas转pivot, groupby等结果为dataFrame--彻底解决多表头问题
  8. 在redhat9中交叉编译nano-X nxlib和fltk
  9. 小程序如何写tab选项卡
  10. 实用技巧:使用 jQuery 异步加载 JavaScript 脚本