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 100001using namespace std;typedef long long LL;int n;
int tot,front[N],to[N<<1],nxt[N<<1],val[N<<1];int root,min_size;
int siz[N],mx[N];bool vis[N];LL g[N<<1][2],f[N<<1][2];
int cnt[N<<1];
int max_dis,min_dis;LL ans;void read(int &x)
{x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; 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]=1; mx[x]=0;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]==1) g[d+n][0]++;else g[d+n][1]++;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+1;get_size(x,0);get_root(x,x,0);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][1];ans+=g[n][0]*f[n][0];for(int j=min_dis;j<=max_dis;++j) ans+=g[j+n][0]*f[-j+n][1]+g[j+n][1]*f[-j+n][0]+g[j+n][1]*f[-j+n][1];for(int j=min_dis;j<=max_dis;++j){f[j+n][0]+=g[j+n][0];f[j+n][1]+=g[j+n][1];g[j+n][0]=g[j+n][1]=0;}}for(int i=minn;i<=maxn;++i) f[i+n][0]=f[i+n][1]=0;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=1;i<n;++i){read(u); read(v); read(w);if(!w) w=-1;add(u,v,w);}work(1,0);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。

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8470627.html

bzoj千题计划248:bzoj3697: 采药人的路径相关推荐

  1. BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...

  2. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  3. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  4. bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...

  5. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  6. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...

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

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

  8. bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的 ...

  9. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子化简一下,发现最后只跟 Σ xi*yi 有关 第二个序列反转,就可以用FFT优化 注意: ...

最新文章

  1. python保存代码_python操作文件读写新增保存代码
  2. mano安全_爱立信:O-RAN存在的安全风险
  3. Java HttpClient使用小结
  4. javascript随堂练习(分支,循环语句)
  5. 华为鸿蒙os2.0系统何时搭载手机,鸿蒙OS 2.0系统正式发布!余承东:明年华为系手机将会搭载...
  6. ASCIIUNICODE编码演化
  7. 细说 ASP.NET控制HTTP缓存[转]
  8. 国产杂牌机java_国货精品 山寨 杂牌 HiPhone 诺卡 MTK联发科 mrp
  9. Latex同时合并表格的多行多列
  10. 【Java】所有做过的面试题
  11. JDK下载安装以及idea环境变量的配置(详细步骤)
  12. 5角硬币中的币王,已价值16000元,谁家有?
  13. 入力禁则文字check
  14. 铸造数据安全堤坝,华为云数据灾备解决方案就是强
  15. (论文笔记)SC4D: A Sparse 4D Convolutional Network for Skeleton-Based Action Recognition
  16. Mathematica中将多个动态图合并在一起(包括自动与手动)
  17. 关于H5的一些杂思细想(一)
  18. 【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码
  19. java 项目 订单编号生成规则及代码
  20. Activiti 查看流程历史记录

热门文章

  1. 拍拍网t恤DIY效果
  2. 基于SpringBoot的乡村医生诊疗系统的设计与实现
  3. Docker+Mongodb
  4. WPF 支持分组互斥的 RadioButton 式单选菜单
  5. JMeter脚本获取变量名、检验字符串值
  6. 蓝桥杯基础练习题3(16进制转8进制)1
  7. JavaScript高级程序设计44.pdf
  8. myeclipse修改编译器版本的方法 .
  9. effective c++ 条款10 让operator= 返回*this的引用
  10. asp.net的cms 核心代码篇