传送门

本蒟蒻AC的第二道点分治,调了30min" role="presentation" style="position: relative;">30min30min发现自己把gcd" role="presentation" style="position: relative;">gcdgcd写错了。

这题是一个点分治裸板,记录整颗子树中到根的距离模3" role="presentation" style="position: relative;">33的情况,容斥一下扣去多算的部分就行了。

代码如下:

  1. #include<bits/stdc++.h>
  2. #define N 20005
  3. using namespace std;
  4. inline int read(){
  5. int ans=0;
  6. char ch=getchar();
  7. while(!isdigit(ch))ch=getchar();
  8. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
  9. return ans;
  10. }
  11. int n,tot,first[N],siz[N],msiz[N],d[N],cnt[3],sum,rt,ans=0;
  12. bool vis[N];
  13. struct Node{int w,v,next;}e[N<<1];
  14. inline void add(int u,int v,int w){e[++tot].v=v,e[tot].w=w,e[tot].next=first[u],first[u]=tot;}
  15. inline void getroot(int p,int fa){
  16. siz[p]=1,msiz[p]=0;
  17. for(int i=first[p];i;i=e[i].next){
  18. int v=e[i].v;
  19. if(v==fa||vis[v])continue;
  20. getroot(v,p),siz[p]+=siz[v];
  21. if(siz[v]>msiz[p])msiz[p]=siz[v];
  22. }
  23. msiz[p]=max(msiz[p],sum-siz[p]);
  24. if(msiz[p]<msiz[rt])rt=p;
  25. }
  26. inline void getdis(int p,int fa){
  27. ++cnt[d[p]];
  28. for(int i=first[p];i;i=e[i].next){
  29. int v=e[i].v;
  30. if(v==fa||vis[v])continue;
  31. d[v]=(d[p]+e[i].w)%3,getdis(v,p);
  32. }
  33. }
  34. inline int calc(int p,int v){
  35. cnt[0]=cnt[1]=cnt[2]=0,d[p]=v,getdis(p,0);
  36. return cnt[0]*cnt[0]+cnt[1]*cnt[2]*2;
  37. }
  38. inline void solve(int p){
  39. ans+=calc(p,0);
  40. vis[p]=true;
  41. for(int i=first[p];i;i=e[i].next){
  42. int v=e[i].v;
  43. if(vis[v])continue;
  44. ans-=calc(v,e[i].w);
  45. rt=0,sum=siz[v];
  46. getroot(v,0);
  47. solve(rt);
  48. }
  49. }
  50. inline int gcd(int a,int b){while(b){int t=a;a=b,b=t%a;}return a;}
  51. int main(){
  52. memset(vis,false,sizeof(vis));
  53. n=read();
  54. for(int i=1;i<n;++i){
  55. int u=read(),v=read(),w=read()%3;
  56. add(u,v,w),add(v,u,w);
  57. }
  58. rt=0,msiz[0]=sum=n,getroot(1,0),solve(rt);
  59. int g=gcd(ans,n*n);
  60. printf("%d/%d",ans/g,n*n/g);
  61. return 0;
  62. }

2018.07.20 bzoj2152: 聪聪可可(点分治)的更多相关文章

  1. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  2. 2018.07.20 洛谷P4178 Tree(点分治)

    传送门 又一道点分治. 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案. 代码如下: #include<bits/stdc++.h> #define N 40005 using ...

  3. 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)

    传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...

  4. 2018.07.20 bzoj3211: 花神游历各国(线段树)

    传送门 维护区间开方,区间求和.这个是线段树常规操作. 显然一个数被开方若干次之后要么是1,要么是0,所以用线段树维护区间最大和区间和,如果区间最大不超过1就剪枝剪掉,不然就继续递归直到叶节点时停下进 ...

  5. 2018.07.20 atcoder Largest Smallest Cyclic Shift(贪心)

    传送门 题意:给你x个a,y个b,z个c,显然这些字符可以拼成若干字符串,然后求这些字符串中最小表示法表示出来的最大的那一个. 解法:贪心思想,用multiset维护现在拼成的字串,每次取一个最小的和 ...

  6. 【BZOJ2152】聪聪可可(点分治)

    [BZOJ2152]聪聪可可(点分治) 题面 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电 ...

  7. BZOJ2152 [国家集训队] 聪聪可可 [点分治]

    题目传送门 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 5237  Solved: 2750[Submit][Status][Discuss ...

  8. BZOJ2152 聪聪可可 【点分治】

    BZOJ2152 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问 ...

  9. 【bzoj2152】【聪聪可可】【点分治】

    [问题描写叙述] 聪聪和可但是兄弟俩.他们俩常常为了一些琐事打起来,比如家中仅仅剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(但是他们家仅仅有一台电脑)--遇到这样的问题,普通情况下石头剪刀布就好 ...

随机推荐

  1. redis该怎么用

    最近一些人在介绍方案时,经常会出现redis这个词,于是很多小伙伴百度完redis也就觉得它是一个缓存,然后项目里面把数据丢进去完事,甚至有例如将实体属性拆分塞进redis hash里面的奇怪用法等等 ...

  2. springboot - SqlSessionFactoryBean falls in circular dependencies by Spring Boot's DataSourceInitializer

    springboot mybatis配置多数据源的时候,报错:There is a circular dependency between 7 beans in the application con ...

  3. 使用seaborn制图(箱型图)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 设置风格, ...

  4. JAVA中request.getParameterMap()用法笔记

    一. 根据Java规范:request.getParameterMap()返回的是一个Map类型的值,该返回值记录着前端(如jsp页面)所提交请求中的请求参数和请求参数值的映射关系.这个返回值有个特别 ...

  5. JAVA的String类的常用方法(转载)

    Java-String类的常用方法总结   一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的f ...

  6. Scrapy简单入门及实例讲解-转载

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  7. rook 记录

    更改rook 集群的配置 https://github.com/rook/rook/blob/master/design/cluster-update.md rook集群升级流程 https://ro ...

  8. 《Blue Flke》第一次作业:团队亮相

    1.队名:Blue Flke 团队格言:决心是成功的力量,耐心是成功的保障. 2.团队成员组成:  201571030129/ 王胜海 (组长)  201571030126/ 妥志福 20157103 ...

  9. ping,telnet,tracert分别用的是什么协议

    Telnet使用的是tcp协议使用示例:telnet 192.168.1.20 80 ping命令使用的是icmp协议示例:ping www.sina.com.cn或ping 192.168.1.10 ...

  10. Metropolis(多源点最短路)

    Metropolis https://www.nowcoder.com/acm/contest/203/I 题目描述 魔方国有n座城市,编号为.城市之间通过n-1条无向道路连接,形成一个树形结构. 在 ...