听说是树分治的题,就进来了,然而一看数据,最大才2000   n^2暴力应该能过啊;但是T了,因为——此题时限0.3秒、、听说树形dp和点分治都可以, 那先想想吧结果,竟然搞了一天、、、如果学完了树分治, 其实思路是好想的:3的倍数和具体的数字没有关系,所以只需统计dis%3的值,因为:所有%3=1的数+%3=2的数再%3一定=0,对答案有贡献(魔法分配律)需要递归加减的量就是 余数为2的个数*(余数为1的个数-1)+∑(i=1;i<(余数为0的个数-1))(i);

直接树分治就可以搞了。
码:

#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>
#define N 20001
#define M 40002
int tot,xia[N],d[N],zhe,hou[M],zhong[M],zhi[M],x,y,n,z,size[N],root,max1=1e9,yu[3],ans;
bool vis[N];
void add(int x,int y,int z)
{hou[++tot]=xia[x],xia[x]=tot,zhong[tot]=y,zhi[tot]=z;
}
void dfs(int now,int fa)
{size[now]=1;int maxx=0;for(int i=xia[now];i!=-1;i=hou[i]){int nd=zhong[i];if(nd==fa||vis[nd])continue;dfs(nd,now);size[now]+=size[nd];maxx=max(maxx,size[nd]);    }maxx=max(maxx,tot-size[now]);if(maxx<max1)max1=maxx,root=now;
}
void dfs2(int now,int fa)
{yu[d[now]%3]++;     for(int i=xia[now];i!=-1;i=hou[i]){int nd=zhong[i];if(vis[nd]||nd==fa)continue;d[nd]=d[now]+zhi[i];dfs2(nd,now);}
}
int work(int now,int hehe)
{yu[0]=0;yu[1]=0;yu[2]=0;d[now]=hehe;
//  cout<<now<<" "<<d[now]<<endl;
//  zhe=now;dfs2(now,0);    return yu[1]*yu[2]+(yu[0])*(yu[0]-1)/2;
}
//int work2(int now)
//{//  yu[0]=0;
//      yu[1]=0;
//      yu[2]=0;
//  zhe=now;
//      dfs2(now,0);
//yu[d[now]%3]++;
//   // cout<<now<<" "<<d[now]<<endl;
//
//      return yu[1]*yu[2]+(yu[0]+1)*yu[0]/2;
//
//}
int solve(int now)
{   //cout<<now<<" ";ans+=work(now,0);//cout<<now<<" "<<ans<<" ";vis[now]=1;for(int i=xia[now];i!=-1;i=hou[i]){int nd=zhong[i];if(vis[nd])continue;ans-=work(nd,zhi[i]);//  cout<<nd<<" "<<ans<<endl;max1=1e9;tot=size[nd];dfs(nd,now);solve(root);        }
}
int gcd(int a,int b)
{if(!b)return a;return gcd(b,a%b);
}
int main()
{memset(xia,-1,sizeof(xia));scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z);add(y,x,z);     }
//   for(int i=xia[4];i!=-1;i=hou[i]
//   {//      cout<<zhong[i]<<" ";
//   }
//   cout<<endl;max1=1e9;tot=n;dfs(1,0);solve(root);int hehehe=gcd(ans*2+n,n*n);    printf("%d/%d",(ans*2+n)/hehehe,n*n/hehehe);}

可以分析一下

注意到了根节点本身也被拉到%3=0的序列中了

注意到了经过上一个根的同一子树的情况都应该减掉,直接套用原来加的函数计算即可(子树的根节点在总的根节点的距离和其他节点是同级的,所以子树的根节点也要一块算进去,不用特殊处理!!!)

另一点要注意:减的操作要在找重心前!!!

这样来看是可以保证正确的,
但如果你想闹着玩,你也可以把计算方法改成:余数为2的个数*余数为1的个数+∑(i=1;i<余数为0的个数)(i)
这也是不影响的,因为如果你把单链也算进去,减的时候的同一子树的单链也会被减掉,所以是无意义的

虽然犀利糊涂的过了,但有一点比较重要,看到上面大段注释掉的代码应该知道:
加减的函数 我当成了不一样的!!
今天是我最ZZ的一天
其实分析都不用分析,因为既然是递归,要加要减肯定是一起的。

2017.3.16 聪聪可可 思考记录(非常不容易)相关推荐

  1. 2017.4.16 麦森数 思考记录

    这个题作为普及组的题简直丧心病狂,就然在03年的普及(小学+初中)组考察 对数 和   高精快速幂 2的n次方位数=n*log10(2)   下取整    +1 gjksm易错点: 1.乘的时候进位和 ...

  2. 2017.10.5 最短母串 思考记录

    这个题n<=15,可以用10表示选取情况下的最优值 预处理两个串之间的连接关系,然后枚举状态转移 然而这个题还要输出方案,,而且还不让你开空间. 所以只能记录前继动态判断.. 所以十分难写难调 ...

  3. 2017.9.26 块的计数 思考记录

    这种题就属于那种描述很简单,要求很简单,但就是无从下手的题 这个题我只有n根n做法..枚举因数检验.. 首先对于任何块的大小,方案唯一,这是显然的,,如果划分位置改变1,一定有一个位置+1,一个位置- ...

  4. 2017.8.8 魔兽地图DotR 思考记录

    假题害人..  明明说了是一棵树,却还要强行加一组坑爹数据   所以网上的题解挂了好多 这题是很综合的树上背包问题. 由依赖关系转化为一些枚举来跑多重背包 由于是 "一棵树" 所以 ...

  5. 2017.3.27 生成魔咒 思考记录(有史以来最不容易)

    做了三天,实在太坑了 终于100文章了 这个题要求每次在单词的末尾加一个字母,再查询本质不同的串的个数.. 既然是子串满足连续性,那就可以后缀数组+lcp搞了: 具体计算方式: 由于后缀数组的开头是包 ...

  6. 2017.3.25 魔术球问题 思考记录

    这个题还是不难的..(想了20分钟就出完解) 二分+网络流检验,,能加在上面的数大的向小的连边 总点数-最大匹配>n    :{l=mid+1,      记录答案       } else   ...

  7. 2017.10.23 chess 中国象棋 思考记录

    这种题的一般解法: 1. 发现状压可以搞,然后发现状态爆炸 2.考虑状态特点,一共只有几种可能的状态 3.考虑可不可以只对状态进行计数 4.离散统计贡献 码: #include<iostream ...

  8. 2017.10.19 起床困难综合征 思考记录

    2333noi送分题 首先暴力试每个数有些二进制位是会重复算的,,所以就考虑能否把每个二进制位独立考虑 老性质:二进制运算每一位独立 所以二进制dp,如果这一位输入1,是多少,输入0,是多少 然后按二 ...

  9. 2017.10.11 network 网络扩容 思考记录

    第一问是网络流. 第二问是费用流,但之前的边依然是可以用的,所以每个点决策:用原来的流量    购买一条流量,扫每条边加进去就可以了 然后限制流出为k 码: #include<iostream& ...

最新文章

  1. thrift框架使用C++
  2. 阿里巴巴开源技术汇总:115个软件(一)
  3. IPv4如何向IPv6过渡?—Vecloud微云
  4. php 怎么防止提交空记录,为什么空提交什么都不提示?
  5. .NET Core 学习资料精选:入门
  6. 牛客题霸 二分查找 C++题解/答案
  7. PCM复用设备主要传输什么业务?
  8. i2c_add_driver函数用法
  9. Consolidate Conditional Expression(合并条件表达式)
  10. 查询同一组的最大最小值及明细
  11. 海康摄像头不记得登陆密码了怎么办?2020年联系人工客服最新版解答方案
  12. vwap 公式_「」当天平均价 股票 公式-通达信当日均价计算公式-TOP金融网
  13. SSR检测,定位~MISA,perl
  14. [fsevents@^1.2.2] optional install error: Package require os(darwin) not compatible with your platfo
  15. ucml 连接虚字段
  16. windows 模拟按键与鼠标
  17. python数值运算m op n_M OP N数值运算问题
  18. 腾讯云搭建多终端《你画我猜》Socket服务器
  19. 婚姻里过得好的女人,性格大都强势
  20. 某省住房和城建网的AES加密

热门文章

  1. Android 内存泄漏之handler
  2. Android笔记 fragment的生命周期
  3. 图解算法系列笔记(三)
  4. python卸载旧版本后依旧残余的问题
  5. JSP页面元素-新手向
  6. java描述常用的集合类_Java常用的集合类
  7. python定义变量名的时候、需要注意问题_第39p,Python模块的名称空间问题,应该讲完了吧...
  8. 图片缩小不失真_科技论文中图片的处理方法有哪些?
  9. java泛型区间_JAVA 14(泛型)
  10. java按键修改_修改键位映射,打造自己的个性键盘 [转自赵翔鹏的Blog]