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. CSS快速入门-组合选择器

    <div class="gradefather"> hello1 <div class="father">hello2 <p cl ...

  2. git 报错 error: insufficient permission for adding an object to repository database ./objects

    参照:http://stackoverflow.com/questions/1918524/error-pushing-to-github-insufficient-permission-for-ad ...

  3. 复习下VLAN的知识

    转载:来自百度百科 VLAN一般指虚拟局域网 VLAN(Virtual Local Area Network)的中文名为"虚拟局域网". 虚拟局域网(VLAN)是一组逻辑上的设备和 ...

  4. Pi Zero三代版本演化比较

    本文介绍Pi Zero的版本演进. 5美元的Pi Zero一上市即造成轰动! 2015年11月树莓派基金会发表了只有5美元的树莓派计算机:PiZero,且只要购买纸本的第40期MagPi杂志就可以附送 ...

  5. 微软职位内部推荐-Senior Software Engineer_HPC

    微软近期Open的职位: Job Title: Senior Software Engineer_HPC Location: Shanghai, China Are you passionate ab ...

  6. 第二十次ScrumMeeting博客

    第二十次ScrumMeeting博客 本次会议于12月11日(一)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容 ...

  7. 桌面输入法评测报告 之 搜狗拼音输入法vs必应拼音输入法

    输入法是电脑用户不可或缺的软件,它几乎无时无刻不陪伴在使用者的身旁.一个优秀的输入法,应该满足客户对使用体验以及效率的需求.我们小队的任务便是对当今最为常用的两种输入法: 搜狗拼音输入法和必应拼音输入 ...

  8. 每日scrum(7)

    今天是小组用来写文稿的日子,包括软件需求分析报告,概要设计报告,详细设计报告,数据库设计报告,软件测试报告,各组员领取自己的任务然后完成~ 任务看板: 燃尽图:

  9. Daily Scrum 10.20

    今天进行了团队第一次scrum meeting,在这次会议中,我们针对NABC模型以及开发前期的工作进行了探讨. 第一次会议 主要内容如下: 为了大家接下来几周的开发效率,需要共同商量团队的一些规则 ...

  10. 浅谈个人对RAID技术的理解

    RAID,字面意思为一种廉价的冗余磁盘阵列,它是通过将大量的磁盘分组,实现了数据冗余,目的是为了保护数据.RAID现已经应用于计算机各个领域.它的优点是降低了工作成本并提高了效率,并且使系统有稳定的运 ...