点分治:

点分治的题目基本一样,都是路径计数。

其复杂度的保证是依靠 $O(n)$ 找重心的,每一次至少将问题规模减小为原先的$1/2$。

找重心我喜欢$BFS$防止爆栈。

  1. int Root(int x){
  2. dfsn[]=;
  3. q.push(x); fa[x]=;
  4. flag[x]=;
  5. while(!q.empty()){
  6. int x=q.front(); q.pop();
  7. dfsn[++dfsn[]]=x;
  8. for(int i=g[x];i;i=E[i].to)
  9. if(!v[p] && !flag[p]){
  10. fa[p]=x;
  11. flag[p]=;
  12. q.push(p);
  13. }
  14. }
  15. for(int i=;i<=dfsn[];i++){
  16. siz[dfsn[i]]=;
  17. h[dfsn[i]]=;
  18. flag[dfsn[i]]=;
  19. }
  20. int root=;
  21. for(int i=dfsn[];i>=;i--){
  22. int x=dfsn[i];
  23. if(fa[x]){
  24. siz[fa[x]]+=siz[x];
  25. h[fa[x]]=max(h[fa[x]],siz[x]);
  26. }
  27. h[x]=max(h[x],dfsn[]-siz[x]);
  28. if(!root || h[x]<h[root]) root=x;
  29. }
  30. return root;
  31. }

故总共有 $O(logn)$ 层。

在每一层我们分别对不同的块(删点而形成)采用 $O(siz[p])$ 的算法。

主定理 $T(n) = T(n/2) + O(n)$

总体上是 $O(nlogn)$

大体框架如下

  1. void DC(int x){
  2. v[x]=;
  3. for(int i=g[x];i;i=E[i].to)
  4. if(!v[p]){
  5. // 大体上是f[x]*ft[x]就是
  6. // Ans = (之前的子树的路径数)*(当前子树的路径数)
  7. }
  8. // 将标记什么的清空,注意保证复杂度是O(siz)不是O(n)
  9. for(int i=g[x];i;i=E[i].to)
  10. if(!v[p]) DC(Root(p));
  11. }

然后对于点分治路径的统计,通常有dp,数据结构,数论等等的方法。

注意:要记得上面的方法没有统计以点x为起点的路径条数,记得加上。

例题:

BZOJ 3697

题意:

给出一棵树,每一条边为黑或白,统计满足条件的路径数

1.路径上黑色和白色的个数相等

2.路径上存在一个点使得起点到当前点黑色和白色的个数相等,此点不能是起点终点。

乍一看是没有解法的,套用点分治。

问题转化为统计过点x的合法路径条数。

套用dp

$f(x,0)$ 表示和为x,无休息站的

$f(x,1)$ 表示和为x,有休息站的

$$ans = f(0,0) * ft(0,0) + \sum_{i=-d}^d {f(i,0) \cdot ft(-i,1) + f(i,1) \cdot ft(-i,0) + f(i,1) \cdot ft(-i,1)} $$

 

条件2可以转化为在当前点到x的路径上有点的$dis(p) = dis(now)$

所以注意保证初始化的复杂度

所以记录一下当前的最大深度,初始化 $f$ 数组和 $ft$ 数组的时候从0循环到 $max deep$

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5.  
  6. #define N 400010
  7. #define p E[i].x
  8. #define LL long long
  9. #define debug(x) cout<<#x<<" = "<<x<<endl;
  10.  
  11. /*
  12. 树形dp
  13. f(x,0) 表示和为x,无休息站的
  14. f(x,1) 表示和为x,有休息站的
  15. ans = f[0][0] * ft[0][0] +
  16. ∑ f[i][0]*ft[-i][1] + f[i][1]*ft[-i][0] + f[i][1]*ft[-i][1]
  17. (-d <= i <= d)
  18. */
  19.  
  20. using namespace std;
  21.  
  22. struct edge{
  23. int x,to,v;
  24. }E[N<<];
  25.  
  26. int n,totE;
  27. int g[N],dfsn[N],fa[N],siz[N],h[N];
  28. bool v[N],flag[N];
  29. LL ans;
  30. LL f[N][],ft[N][];
  31. queue<int> q;
  32.  
  33. void ade(int x,int y,int v){
  34. E[++totE]=(edge){y,g[x],v}; g[x]=totE;
  35. }
  36.  
  37. int Root(int x){
  38. dfsn[]=;
  39. q.push(x); fa[x]=;
  40. flag[x]=;
  41. while(!q.empty()){
  42. int x=q.front(); q.pop();
  43. dfsn[++dfsn[]]=x;
  44. for(int i=g[x];i;i=E[i].to)
  45. if(!v[p] && !flag[p]){
  46. fa[p]=x;
  47. flag[p]=;
  48. q.push(p);
  49. }
  50. }
  51. for(int i=;i<=dfsn[];i++){
  52. siz[dfsn[i]]=;
  53. h[dfsn[i]]=;
  54. flag[dfsn[i]]=;
  55. }
  56. int root=;
  57. for(int i=dfsn[];i>=;i--){
  58. int x=dfsn[i];
  59. if(fa[x]){
  60. siz[fa[x]]+=siz[x];
  61. h[fa[x]]=max(h[fa[x]],siz[x]);
  62. }
  63. h[x]=max(h[x],dfsn[]-siz[x]);
  64. if(!root || h[x]<h[root]) root=x;
  65. }
  66. return root;
  67. }
  68.  
  69. int mxdep;
  70. int cnt[N],d[N],dis[N];
  71.  
  72. void dfs(int x,int fa){
  73. mxdep=max(mxdep,d[x]);
  74. if(cnt[dis[x]]) ft[dis[x]][]++;
  75. else ft[dis[x]][]++;
  76. cnt[dis[x]]++;
  77. for(int i=g[x];i;i=E[i].to)
  78. if(p!=fa&&!v[p]){
  79. d[p]=d[x]+;
  80. dis[p]=dis[x]+E[i].v;
  81. dfs(p,x);
  82. }
  83. cnt[dis[x]]--;
  84. }
  85.  
  86. void DC(int x){
  87. v[x]=;
  88. f[n][]=;
  89. int mx=;
  90. for(int i=g[x];i;i=E[i].to)
  91. if(!v[p]){
  92. dis[p]=n+E[i].v;
  93. d[p]=mxdep=;
  94. dfs(p,p);
  95. mx=max(mx,mxdep);
  96. ans+=(f[n][]-)*ft[n][];
  97. for(int j=-mxdep;j<=mxdep;j++){
  98. ans+=ft[n-j][]*f[n+j][]+
  99. ft[n-j][]*f[n+j][]+ft[n-j][]*f[n+j][];
  100. }
  101. for(int j=n-mxdep;j<=n+mxdep;j++){
  102. f[j][]+=ft[j][];
  103. f[j][]+=ft[j][];
  104. ft[j][]=ft[j][]=;
  105. }
  106. }
  107. for(int i=n-mx;i<=n+mx;i++)
  108. f[i][]=f[i][]=;
  109. for(int i=g[x];i;i=E[i].to)
  110. if(!v[p]) DC(Root(p));
  111. }
  112.  
  113. int main(){
  114. scanf("%d",&n);
  115. for(int i=,x,y;i<n;i++){
  116. int v;
  117. scanf("%d%d%d",&x,&y,&v);
  118. if(!v) v=-;
  119. ade(x,y,v); ade(y,x,v);
  120. }
  121. DC(Root());
  122. printf("%lld\n",ans);
  123. return ;
  124. }

然后是HDU 4812

题意:给出一棵树,每一个点有一个点权,找到一条点权乘积为K的路径,输出起点和终点,要求字典序最小。

求一下逆元,然后用map记录前面的所有子树能够到达的权值(乘积)

注意这是点权,不同于边权,所以在处理过点x的路径的时候要谨慎,我的做法是将路径拆为 x点 , 之前子树中的一条链, 当前子树中的一条链。

用map复杂度多一个log,然而也能过。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <map>
  5. #include <queue>
  6.  
  7. #define N 400010
  8. #define LL long long
  9. #define mod 1000003
  10. #define p E[i].x
  11. #define INF 0x3f3f3f3f
  12. #define ipos map<int,int>::iterator
  13.  
  14. using namespace std;
  15.  
  16. struct edge{
  17. int x,to;
  18. }E[N<<];
  19.  
  20. map<int,int> ft,f;
  21. int n,ansv[],totE,K;
  22. int h[N],g[N],siz[N],a[N],fa[N],dfsn[N],dis[N];
  23. bool v[N],flag[N];
  24. queue<int> q;
  25.  
  26. int add(int a,int b){
  27. if(a+b>=mod) return a+b-mod;
  28. return a+b;
  29. }
  30.  
  31. int mul(int a,int b){
  32. return (int)((LL)a*(LL)b%mod);
  33. }
  34.  
  35. int qpow(int x,int n){
  36. int ans=;
  37. for(;n;n>>=,x=mul(x,x))
  38. if(n&) ans=mul(ans,x);
  39. return ans;
  40. }
  41.  
  42. int inv(int x){
  43. return (int)qpow((LL)x,mod-2LL);
  44. }
  45.  
  46. void ade(int x,int y){
  47. E[++totE]=(edge){y,g[x]}; g[x]=totE;
  48. }
  49.  
  50. int Root(int x){
  51. dfsn[]=;
  52. q.push(x); fa[x]=;
  53. flag[x]=;
  54. while(!q.empty()){
  55. int x=q.front(); q.pop();
  56. dfsn[++dfsn[]]=x;
  57. for(int i=g[x];i;i=E[i].to)
  58. if(!v[p] && !flag[p]){
  59. fa[p]=x;
  60. flag[p]=;
  61. q.push(p);
  62. }
  63. }
  64. for(int i=;i<=dfsn[];i++){
  65. siz[dfsn[i]]=;
  66. h[dfsn[i]]=;
  67. flag[dfsn[i]]=;
  68. }
  69. int root=;
  70. for(int i=dfsn[];i>=;i--){
  71. int x=dfsn[i];
  72. if(fa[x]){
  73. siz[fa[x]]+=siz[x];
  74. h[fa[x]]=max(h[fa[x]],siz[x]);
  75. }
  76. h[x]=max(h[x],dfsn[]-siz[x]);
  77. if(!root || h[x]<h[root]) root=x;
  78. }
  79. return root;
  80. }
  81.  
  82. void bfs(int x){
  83. dfsn[]=;
  84. q.push(x); flag[x]=;
  85. while(!q.empty()){
  86. int x=q.front(); q.pop();
  87. dfsn[++dfsn[]]=x;
  88. if(!ft.count(dis[x]) || ft[dis[x]]>x)
  89. ft[dis[x]]=x;
  90. for(int i=g[x];i;i=E[i].to)
  91. if(!v[p] && !flag[p]){
  92. flag[p]=;
  93. dis[p]=mul(dis[x],a[p]);
  94. q.push(p);
  95. }
  96. }
  97. for(int i=;i<=dfsn[];i++)
  98. flag[dfsn[i]]=;
  99. }
  100.  
  101. void upd(int a,int b){
  102. if(a>b) swap(a,b);
  103. if(ansv[]>a || ansv[]==a&&ansv[]>b){
  104. ansv[]=a;
  105. ansv[]=b;
  106. }
  107. }
  108.  
  109. void DC(int x){
  110. // printf("node : %d\n",x);
  111. v[x]=;
  112. f.clear();
  113. f[]=x;
  114. for(int i=g[x];i;i=E[i].to)
  115. if(!v[p]){
  116. ft.clear();
  117. dis[p]=a[p];
  118. bfs(p);
  119. for(ipos it=ft.begin();it!=ft.end();it++){
  120. int tmp=(*it).first;
  121. if(f.count(mul(mul(K,inv(tmp)),inv(a[x])))){
  122. upd(f[mul(mul(K,inv(tmp)),inv(a[x]))],
  123. (*it).second);
  124. }
  125. }
  126. for(ipos it=ft.begin();it!=ft.end();it++){
  127. if(!f.count((*it).first)) f[(*it).first]=(*it).second;
  128. else f[(*it).first]=min(f[(*it).first],(*it).second);
  129. }
  130. }
  131. for(int i=g[x];i;i=E[i].to)
  132. if(!v[p]) DC(Root(p));
  133. }
  134.  
  135. int main(){
  136. // freopen("test.in","r",stdin);
  137. while(scanf("%d%d",&n,&K)==){
  138. ansv[]=ansv[]=INF;
  139. totE=;
  140. for(int i=;i<=n;i++) g[i]=;
  141. for(int i=;i<=n;i++) scanf("%d",&a[i]),v[i]=;
  142. for(int i=,x,y;i<n;i++){
  143. int v;
  144. scanf("%d%d",&x,&y);
  145. ade(x,y);
  146. ade(y,x);
  147. }
  148. DC(Root());
  149. if(ansv[]==INF) puts("No solution");
  150. else printf("%d %d\n",ansv[],ansv[]);
  151. }
  152. return ;
  153. }

最后是 国家集训队的 crash的文明世界

题意:

定义:

求所有点的S(i)

很显然是点分治,斯特林数是什么,我不会 TAT

记录$f(i)$表示$\sum {dist(p,x)^i }$,$ft$同理

考虑每一次统计过x的路径时将过x的路径的影响加入子树中的点,同时在最后将$S(i)$加上$f(K)$

坑点就是合并的时候要用一下 二项式展开

$$ S(p) += \sum_{i=0}^K {C(K,i) * f(K-i) * b^i}$$

然后注意要统计全路径,所以上面的框架不适用(上面的框架对于当前子树只能统计遍历过的子树,而应该是统计所有除了当前子树的权值和)

然后就可以了,自己歪歪(看不懂题解),一遍AC爽。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5.  
  6. #define N 200010
  7. #define mod 10007
  8. #define M 310
  9. #define p E[i].x
  10.  
  11. using namespace std;
  12. /*
  13. f[j] 之前的 dist(x,p)^j
  14. ft[j] 当前的 dist(x,p)^j
  15. S[p] += ∑C(K,i) * a^{K-i} * b^i (0<=i<=K)
  16. O(lognK)
  17. */
  18.  
  19. int n,K,totE;
  20. int g[N],f[M],siz[N],h[N],fa[N],dfsn[N],S[N],d[N];
  21. int C[M][M];
  22. bool v[N],flag[N];
  23. queue<int> q;
  24.  
  25. int add(int a,int b){
  26. if(a+b>=mod) return a+b-mod;
  27. return a+b;
  28. }
  29.  
  30. int mul(int a,int b){
  31. return a*b%mod;
  32. }
  33.  
  34. struct edge{
  35. int x,to;
  36. }E[N<<];
  37.  
  38. void ade(int x,int y){
  39. E[++totE]=(edge){y,g[x]}; g[x]=totE;
  40. }
  41.  
  42. int qpow(int x,int n){
  43. int ans=;
  44. for(;n;n>>=,x=mul(x,x))
  45. if(n&) ans=mul(ans,x);
  46. return ans;
  47. }
  48.  
  49. int Root(int x){
  50. dfsn[]=;
  51. q.push(x); fa[x]=;
  52. flag[x]=;
  53. while(!q.empty()){
  54. int x=q.front(); q.pop();
  55. dfsn[++dfsn[]]=x;
  56. for(int i=g[x];i;i=E[i].to)
  57. if(!v[p] && !flag[p]){
  58. fa[p]=x;
  59. flag[p]=;
  60. q.push(p);
  61. }
  62. }
  63. for(int i=;i<=dfsn[];i++){
  64. siz[dfsn[i]]=;
  65. h[dfsn[i]]=;
  66. flag[dfsn[i]]=;
  67. }
  68. int root=;
  69. for(int i=dfsn[];i>=;i--){
  70. int x=dfsn[i];
  71. if(fa[x]){
  72. siz[fa[x]]+=siz[x];
  73. h[fa[x]]=max(h[fa[x]],siz[x]);
  74. }
  75. h[x]=max(h[x],dfsn[]-siz[x]);
  76. if(!root || h[x]<h[root]) root=x;
  77. }
  78. return root;
  79. }
  80.  
  81. void bfs(int x){
  82. dfsn[]=; d[x]=;
  83. q.push(x); flag[x]=;
  84. while(!q.empty()){
  85. int x=q.front(); q.pop();
  86. dfsn[++dfsn[]]=x;
  87. for(int i=g[x];i;i=E[i].to)
  88. if(!v[p] && !flag[p]){
  89. d[p]=d[x]+;
  90. flag[p]=;
  91. q.push(p);
  92. }
  93. }
  94. for(int i=;i<=dfsn[];i++){
  95. int tmp=;
  96. for(int j=;j<=K;j++){
  97. f[j]=add(f[j],tmp);
  98. tmp=mul(tmp,d[dfsn[i]]);
  99. }
  100. flag[dfsn[i]]=;
  101. }
  102. }
  103.  
  104. int power[M];
  105.  
  106. void solve(int rt){
  107. dfsn[]=; d[rt]=;
  108. q.push(rt); flag[rt]=;
  109. while(!q.empty()){
  110. int x=q.front(); q.pop();
  111. dfsn[++dfsn[]]=x;
  112. for(int i=g[x];i;i=E[i].to)
  113. if(!v[p] && !flag[p]){
  114. d[p]=d[x]+;
  115. flag[p]=;
  116. q.push(p);
  117. }
  118. }
  119. for(int i=;i<=dfsn[];i++){
  120. int tmp=;
  121. for(int j=;j<=K;j++){
  122. f[j]=(f[j]-tmp+mod)%mod;
  123. tmp=mul(tmp,d[dfsn[i]]);
  124. }
  125. }
  126. // printf("son : %d\n",rt);
  127. // for(int i=0;i<=K;i++){
  128. // printf("%d%c",f[i],i==K?'\n':' ');
  129. // }
  130. for(int t=;t<=dfsn[];t++){
  131. int x=dfsn[t];
  132. flag[x]=;
  133. power[]=;
  134. for(int i=;i<=K;i++) power[i]=mul(power[i-],d[x]);
  135. for(int i=;i<=K;i++){
  136. // printf("addto %d = %d\n",x,mul(C[K][i], mul(f[K-i],power[i])));
  137. S[x] = add(S[x], mul(C[K][i], mul(f[K-i],power[i])));
  138. }
  139. S[x]=add(S[x],power[K]);
  140. }
  141. // S[x]=add(S[x],power[K]);
  142. for(int i=;i<=dfsn[];i++){
  143. int tmp=;
  144. for(int j=;j<=K;j++){
  145. f[j]=add(f[j],tmp);
  146. tmp=mul(tmp,d[dfsn[i]]);
  147. }
  148. }
  149. }
  150. //S[p] += ∑C(K,i) * a^{K-i} * b^i (0<=i<=K)
  151. void DC(int x){
  152. v[x]=;
  153. // printf("node : %d\n",x);
  154. // for(int i=1;i<=dfsn[0];i++)
  155. // printf("%d%c",dfsn[i],i==dfsn[0]?'\n':' ');
  156. for(int i=;i<=K;i++) f[i]=;
  157. for(int i=g[x];i;i=E[i].to)
  158. if(!v[p]) bfs(p);
  159. // printf("before\n");
  160. // for(int i=0;i<=K;i++) printf("%d%c",f[i],i==K?'\n':' ');
  161. for(int i=g[x];i;i=E[i].to)
  162. if(!v[p]) solve(p);
  163. S[x]=add(S[x],f[K]);
  164. // printf("base = %d\n",f[K]);
  165. for(int i=g[x];i;i=E[i].to)
  166. if(!v[p]) DC(Root(p));
  167. }
  168.  
  169. int main(){
  170. freopen("civilization.in","r",stdin);
  171. freopen("civilization.out","w",stdout);
  172. scanf("%d%d",&n,&K);
  173. C[][]=;
  174. for(int i=;i<=K;i++){
  175. C[i][]=;
  176. for(int j=;j<=i;j++)
  177. C[i][j]=add(C[i-][j-],C[i-][j]);
  178. }
  179. int L,now,A,B,Q,tmp;
  180. scanf("%d%d%d%d%d",&L,&now,&A,&B,&Q);
  181. for(int i=,x,y;i<n;i++){
  182. now=(now*A+B)%Q;
  183. tmp=(i<L)? i:L;
  184. x=i-now%tmp;
  185. y=i+;
  186. ade(x,y);
  187. ade(y,x);
  188. }
  189. DC(Root());
  190. for(int i=;i<=n;i++){
  191. printf("%d\n",S[i]);
  192. }
  193. return ;
  194. }

总结完了点分治,NOI必胜。

NOI前总结:点分治的更多相关文章

  1. NOI前各种Idea总结以及各种文本乱堆

    转载请注明原文地址:https://www.cnblogs.com/LadyLex/p/9227267.html 不过这篇的确没什么*用了转转吧 2018-6-24 关于一类延迟标记(来自UR14 思 ...

  2. NOI前训练日记

    向别人学习一波,记点流水帐.17.5.29开坑. 5.29 早晨看了道据说是树状数组优化DP的题(hdu5542),然后脑补了一个复杂度500^3的meet in the middle.然后死T... ...

  3. [日常] NOI前划水日记

    NOI前划水日记 开坑记录一下每天的效率有多低 5.24 早上被春哥安排了一场NEERC(不过怎么是qualification round啊) 省队势力都跑去参加THU/PKU夏令营了...剩下四个D ...

  4. NOI前的考试日志

    4.14 网络流专项测试 先看T1,不会,看T2,仙人掌???wtf??弃疗.看T3,貌似最可做了,然后开始刚,刚了30min无果,打了50分暴力,然后接着去看T1,把序列差分了一下,推了会式子,发现 ...

  5. NOI.AC 32 Sort——分治

    题目:http://noi.ac/problem/32 从全是0和1的情况入手,可以像线段树一样分治下去,回到本层的时候就是左半部的右边是1,右半部的左边是0,把这两部分换一下就行.代价和时间一样是n ...

  6. noi前机房日常

    2015/6/16 上午a了一道省选分组赛day1t2,并在cf100553H双倍经验,好评 bzoj3152(ctsc2013)贪心,用priority_queue要清空 bx2k上午交了几十题,他 ...

  7. NOI前总结

    最近也就是天天考试,总结一下. 7.1 开场T1T2都是不可做的概率期望,只有T3看起来可做,于是怒干4h+,将题解里面的所有结论都推出来了,大模拟写的一点毛病都没有,可还是因为2-SAT掌握不熟结果 ...

  8. 博客索引and题目列表

    目录 笔记整理 计划 要学的东西 缺省源 要做的题 搜索 高斯消元 矩阵 排列组合 2019.7.9 2019.7.10 kmp ac自动机 2019.7.11 2019.7.15 笔记整理 1.同余 ...

  9. NOI冲刺计划

    省选过了,剩下大概是NOI冲刺了吧.中间还有一大堆诸如会考,CTSC,APIO等东西. 最近先不急着天天刷八中了吧,多在不同网站见一些题,然后再着重提高一下代码准确性.重点把DP这个板块多练习一下,八 ...

随机推荐

  1. 关于克隆gitlab项目的一些 问题列表

    1. gitLab项目clone过后, 运行ng serve出错: 解决方式: npm install -g node-gyp npm install --global --production wi ...

  2. 【面试 struts2】【第三篇】struts2的问题

    1.struts2的工作流程 1>客户端浏览器发出HTTP请求. 2>根据web.xml配置,该请求被FilterDispatcher接收 3>根据struts.xml配置,找到需要 ...

  3. Node.js机制及原理理解初步

    http://blog.csdn.net/leftfist/article/details/41891407 一.node.js优缺点 node.js是单线程. 好处就是 1)简单 2)高性能,避免了 ...

  4. 《Getting Started with WebRTC》第二章 WebRTC技术介绍

    <Getting Started with WebRTC>第二章 WebRTC技术介绍 本章作WebRTC的技术介绍,主要讲下面的概念:   .  怎样建立P2P的通信   .  有效的信 ...

  5. C#压缩或解压(rar和zip文件)

    /// <summary> /// 解压RAR和ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe)) /// </summary&g ...

  6. maven插件介绍之maven-jar-plugin

    maven-jar-plugin 插件的maven依赖为: <dependency> <groupId>org.apache.maven.plugins</groupId ...

  7. vue 开发前准备工作

    工欲善其事,必先利其器. 第一步,选择一个合适的编辑器: 看vue官网上,有推荐用HBuilder X这个编辑器,这个我在开发微信小程序的时候,就是用的这个编辑器,还可以,挺好用的,也可以用git做版 ...

  8. JavaScript随机数区间限制

    在一段区间内的取某个数字 有一个通用的方法 主要使用了一下两个javascript函数 1.Math.floor() 方法可对一个数进行下舍入 2.Math.random() 方法可返回介于 0 ~ ...

  9. spark0.9.1集群模式执行graphx測试程序(LiveJournalPageRank,新增Connected Components)

    spark最新版公布了.之前的版本号就已经集成了graphx,这个版本号还改了一些bug. 我做了简单測试,只是网上关于集群模式执行spark资料太少了,仅仅有关于EC2(见參考资料1)的.可是还非常 ...

  10. [转]XCode中修改缺省公司名称/开发人员名称

    本文转载至  http://www.cnblogs.com/zhulin/archive/2011/11/24/2261537.html   XCode新建文件后,头部会有开发人员名称,公司名称等信息 ...