Description

采药人的药田是一个树状结构,每条路径上都种植着同种药材。
采药人以自己对药材独到的见解,对每种药材进行了分类。大致分为两类,一种是阴性的,一种是阳性的。
采药人每天都要进行采药活动。他选择的路径是很有讲究的,他认为阴阳平衡是很重要的,所以他走的一定是两种药材数目相等的路径。采药工作是很辛苦的,所以他希望他选出的路径中有一个可以作为休息站的节点(不包括起点和终点),满足起点到休息站和休息站到终点的路径也是阴阳平衡的。他想知道他一共可以选择多少种不同的路径。

Input

第1行包含一个整数N。
接下来N-1行,每行包含三个整数a_i、b_i和t_i,表示这条路上药材的类型。

Output

输出符合采药人要求的路径数目。

Sample Input

7
1 2 0
3 1 1
2 4 0
5 2 0
6 3 1
5 7 1

Sample Output

1

HINT

对于100%的数据,N ≤ 100,000。

这题就恶心了呀
还是点分治
考虑经过点x的路径,f[i][0/1]表示当前子树到根的路径为i,存在/不存在休息点的方案数,g[i][0/1]表示前几棵子树到根的路径为i,存在/不存在休息点的方案数
那么对于一个子树,它对答案的贡献是f[0][0]*g[0][0]+Σf[i][0]*g[-i][1]+f[i][1]*g[-i][0]+f[i][1]*g[-i][1]
第一维搞去掉负数调了半天……
#include<cstdio>
#include<iostream>
#define N 200010
#define LL long long
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
struct edge{int to,next,v;}e[2*N];
int head[N],son[N],f[N],mrk[N],dep[N];
LL s[2*N][2],t[2*N][2],dis[N];
int n,cnt,root,sum,mxd;
bool vis[N];
LL ans;
inline void ins(int u,int v,int w)
{e[++cnt].to=v;e[cnt].v=w;e[cnt].next=head[u];head[u]=cnt;
}
inline void insert(int u,int v,int w)
{ins(u,v,w);ins(v,u,w);
}
inline void getroot(int x,int fa)
{son[x]=1;f[x]=0;for (int i=head[x];i;i=e[i].next)if (!vis[e[i].to]&&fa!=e[i].to){getroot(e[i].to,x);son[x]+=son[e[i].to];f[x]=max(f[x],son[e[i].to]);}f[x]=max(f[x],sum-son[x]);if (f[x]<f[root])root=x;
}
inline void dfs(int x,int fa)
{mxd=max(mxd,dep[x]);if (mrk[dis[x]])s[dis[x]][1]++;else s[dis[x]][0]++;mrk[dis[x]]++;for(int i=head[x];i;i=e[i].next)if (!vis[e[i].to]&&fa!=e[i].to){dep[e[i].to]=dep[x]+1;dis[e[i].to]=dis[x]+e[i].v;dfs(e[i].to,x);}mrk[dis[x]]--;
}
inline void calc(int x)
{int mx=0;t[n][0]=1;for (int i=head[x];i;i=e[i].next)if (!vis[e[i].to]){dis[e[i].to]=n+e[i].v;dep[e[i].to]=1;mxd=1;dfs(e[i].to,0);mx=max(mx,mxd);ans+=(t[n][0]-1)*s[n][0];for (int j=-mxd;j<=mxd;j++)ans+=t[n-j][1]*s[n+j][1]+t[n-j][0]*s[n+j][1]+t[n-j][1]*s[n+j][0];for (int j=n-mxd;j<=n+mxd;j++){t[j][0]+=s[j][0];t[j][1]+=s[j][1];s[j][0]=s[j][1]=0;}}for (int i=n-mx;i<=n+mx;i++)t[i][0]=t[i][1]=0;
}
inline void solve(int x)
{vis[x]=1;calc(x);for (int i=head[x];i;i=e[i].next)if (!vis[e[i].to]){sum=son[e[i].to];   root=0;getroot(e[i].to,0);solve(root);}
}
int main()
{n=read();for (int i=1;i<n;i++){int x=read(),y=read(),z=read();if (!z)z--;insert(x,y,z);}f[0]=n+1;sum=n;getroot(1,0);solve(root);printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/zhber/p/4216245.html

bzoj3697 采药人的路径相关推荐

  1. bzoj千题计划248:bzoj3697: 采药人的路径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3697 点分治 路径0改为路径-1 g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已 ...

  2. BZOJ3697: 采药人的路径(点分治)

    Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天都要进行采药 ...

  3. BZOJ 3697: 采药人的路径 [点分治] [我想上化学课]

    传送门 题意: 路径有$-1,1$两种权值,求有多少路径满足权值和为$0$且有一个点将路径分成权值和为$0$的两段 第四节课本来想去上化学,然后快上课了这道题还没调出来.....可恶我想上化学 昨天两 ...

  4. 【技巧总结】——关于不知道放到哪里的小技巧

    [技巧总结]--关于不知道放到哪里的小技巧 折半搜索 分治 0,1,-1转化 模型转换 [ExtendingSetofPointsExtending\;Set\;of\;PointsExtending ...

  5. 一句话题解(20180210~)

    2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...

  6. 伍六七带你学算法 动态规划 ——不同路径

    力扣 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格 ...

  7. Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题

    以下代码的 GOPATH 路径为 "/home/wohu/GoCode" 1. 同一个包内的函数可以相互调用 代码结构如下: wohu@wohu:~/GoCode/src$ tre ...

  8. Python 标准库之 os (获取当前目录、读取/设置环境变量、重命名文件、运行shell命令、创建/删除/查看目录文件、判断目录/文件/存在、获取绝对路径、获取文件名、获取换行符、获取路径分隔符)

    1. os与sys模块的官方解释如下: os This module provides a portable way of using operating system dependent funct ...

  9. 二叉树中和为某一值的路径

    前言 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数 ...

最新文章

  1. mysql索引底层实现原理_mysql的索引底层之实现原理
  2. SAP SD基础知识之与FI集成相关的流程与配置
  3. spring源码分析之spring-web http详解
  4. WCF发布到IIS7问题的解决方案
  5. 【转】WebSocket API总结
  6. 学生网页设计代码成品 大学生汽车网页代做 红旗汽车网页设计模板下载 HTML汽车网站制作 dreamweaver学生汽车网页设计成品
  7. 深入理解Javascript中构造函数和原型对象的区别
  8. Java应用案例分析_Java应用启动参数实例解析
  9. eclipse中文乱码解决_Stata15:一次性转码,解决中文乱码问题
  10. 将网站转换为应用程序的软件—“Unite”
  11. griddata三维空间插值
  12. 如何成为一名AI人工智能算法工程师?
  13. Office Ribbon 界面开发入门教程:QtitanRibbon详解
  14. IE浏览器不能使用window.open()的解决方案
  15. Clouda聊天室实践
  16. 笔记本移动硬盘linux系统安装教程,移动硬盘怎么安装系统 移动硬盘安装系统教程【图文】...
  17. 思科模拟器实现不同网段主机互ping
  18. 不用计算机怎么算三角函数,1.不用计算机怎么求根式和三角函数值?
  19. nohup 执行mysql命令_Linux nohup命令:后台命令脱离终端运行
  20. NVIDIA NeMo 简介——教程和示例

热门文章

  1. 【视频】vue动态绑定css样式
  2. ThreadPoolExecutor的七个参数详解
  3. 【定区管理功能】定区列表分页条件查询
  4. mysqldumpslow mysql慢日志分析工具
  5. Mac的控制台命令无法使用command not found
  6. 线性规划总结3——单纯形法和对偶单纯形法
  7. 语言解析ssl包_HPSocket v5.0.1:支持 IPv6 及多 SSL 证书
  8. excel中match函数_Excel函数轻松学02:详解Excel函数中的数据类型
  9. 设计模式的理解: 职责链模式 (Chain of Responsibility)
  10. 集合-2(Set(HashSet、TreeSet、LinkedHashSet)、List(ArrayList、LinkedList、Vector)、Map(HashMap、TreeMap...))