http://www.lydsy.com/JudgeOnline/problem.php?id=3697

点分治

路径0改为路径-1

g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已经处理完的兄弟节点子树 中,路径前缀和为i,前面是否还有一个前缀和为i的点

合法的路径分为三类:

1、路径以当前分治重心为端点,ans+=g[0][1]

2、路径跨越分治重心,休息站在分治重心,ans+=g[0][0]*f[0][0]

3、路径跨越分治重心,休息站不在分治重心,ans+= Σ g[i][0]*f[-i][1] + g[i][1]*f[-i][0] + g[i][1]*f[-i][1]  i∈[min_dis,max_dis]

#include<cstdio>
#include<iostream> #define N 100001 using namespace std; typedef long long LL; int n;
int tot,front[N],to[N<<],nxt[N<<],val[N<<]; int root,min_size;
int siz[N],mx[N]; bool vis[N]; LL g[N<<][],f[N<<][];
int cnt[N<<];
int max_dis,min_dis; LL ans; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=w;
} void get_size(int x,int fa)
{
siz[x]=; mx[x]=;
for(int i=front[x];i;i=nxt[i])
if(!vis[to[i]] && to[i]!=fa)
{
get_size(to[i],x);
siz[x]+=siz[to[i]];
if(siz[to[i]]>mx[x]) mx[x]=siz[to[i]];
}
} void get_root(int x,int pa,int fa)
{
mx[x]=max(mx[x],siz[pa]-siz[x]);
if(mx[x]<min_size) min_size=mx[x],root=x;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa && !vis[to[i]]) get_root(to[i],pa,x);
} void get_sum(int x,int fa,int d)
{
if(d>max_dis) max_dis=d;
if(d<min_dis) min_dis=d;
cnt[d+n]++;
if(cnt[d+n]==) g[d+n][]++;
else g[d+n][]++;
for(int i=front[x];i;i=nxt[i])
if(!vis[to[i]] && to[i]!=fa) get_sum(to[i],x,d+val[i]);
cnt[d+n]--;
} void work(int x,int pa)
{
min_size=n+;
get_size(x,);
get_root(x,x,);
int maxn=-n,minn=n;
for(int i=front[root];i;i=nxt[i])
if(!vis[to[i]])
{
max_dis=-n;
min_dis=n;
get_sum(to[i],root,val[i]);
if(max_dis>maxn) maxn=max_dis;
if(min_dis<minn) minn=min_dis;
ans+=g[n][];
ans+=g[n][]*f[n][];
for(int j=min_dis;j<=max_dis;++j)
ans+=g[j+n][]*f[-j+n][]+g[j+n][]*f[-j+n][]+g[j+n][]*f[-j+n][];
for(int j=min_dis;j<=max_dis;++j)
{
f[j+n][]+=g[j+n][];
f[j+n][]+=g[j+n][];
g[j+n][]=g[j+n][]=;
}
}
for(int i=minn;i<=maxn;++i) f[i+n][]=f[i+n][]=;
vis[root]=true;
int rt=root;
for(int i=front[root];i;i=nxt[i])
if(!vis[to[i]]) work(to[i],rt);
} int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
read(n);
int u,v,w;
for(int i=;i<n;++i)
{
read(u); read(v); read(w);
if(!w) w=-;
add(u,v,w);
}
work(,);
cout<<ans;
}

3697: 采药人的路径

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1505  Solved: 515
[Submit][Status][Discuss]

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。

bzoj千题计划248:bzoj3697: 采药人的路径的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...

  2. 最简单的iOS网络请求

    做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大易用的确很好. 但是版本升级就会出现一些问题,所以就自己基于iOS原生封装了一个网络请 ...

  3. Harbor私有镜像仓库无坑搭建

    转载:https://k8s.abcdocker.com/kubernetes_harbor.html 一.介绍 Docker容器应用的开发和运行路不开可靠的镜像管理,虽然Docker官方也提供了公共 ...

  4. hdu 2036:改革春风吹满地(叉积求凸多边形面积)

    改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  5. index索引的一些简单理解

    index索引(普通索引,允许出现相同的索引内容) 1.索引 索引是在数据量和访问量较大的时候,而出现的一种优化数据库的手段 索引可以提高查询(select)的效率,但相应的,它的 INSERT 与 ...

  6. Scrapy持久化存储

    基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬 ...

  7. Istio 流量治理功能原理与实战

    一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中共有4种标准负载均衡算法. •Round_Robin: 轮询算 ...

  8. NetFPGA Demo ——reference_nic_nf1_cml

    NetFPGA Demo --reference_nic_nf1_cml 实验平台 OS:deepin 15.4 开发板:NetFPGA_1G_CML 实验过程 从NetFPGA-1G-CML从零开始 ...

  9. Mininet入门与实战 3.9参课记录

    Mininet入门与实战 Mininet简介 由来:斯坦福大学发明,基于Linux Container架构开发的进程虚拟化网络仿真工具,交换机支持OF协议. 使用情况: 控制器,不推荐自带控制器(bu ...

  10. beta 圆桌桌 4

    031602111 傅海涛 1.今天进展 后台接口大部分完善,并完成交互 2.存在问题 部分接口不稳定 3.明天安排 完成全部接口的交互 4.心得体会 小问题真多,要一个一个解决 031602115 ...