题目描述

Description
Farmer John 正在在计划自己的农场漫步。他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接。这样,他便可以通过这些谷仓间的道路遍及各个谷仓。Farmer John想要选择一条路线:这条路线的起点和终点分别为农场中两个不同的谷仓,这条路线不能重复经过一条边两次。Farmer John担心这条路径可能会偏长,所以他想在路线上寻找一个休息点(当然这个休息点不能为起点或者终点)。

每条边的两旁都是牛群,要么是Charcolais(白毛),要么是Angus(黑毛)。Farmer John是一个聪明人,所以他想要在他通过小路的同时平衡小路两侧阴阳的力量。他要选择一条路径使得他从起点到休息站,和从休息站到终点这两段路上都满足路两边的Charcolais牛群和Angus牛群总数量相同。

Farmer John好奇他能找到多少条如上所述的平衡的路径。我们认为,当且仅当两条路线的边的集合不同时,这两条路径才被认为是不同的,否则认为是相同的路线。就算路线上有多个有效的“休息站”的位置能使路线平衡,我们也只记为一条路线。

请帮助计算有多少条不同的平衡路线。

Input
第1行:包含一个整数N。

第2… N行:每行包含三个整数a_i、b_i和t_i,表示第i条路径连接的两个谷仓a_i、b_i。t_i表示第i条路边上的牛群种类:0表示Charcolais,1表示Angus。

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

Data Constraint
1<= N <=100,000

Hint
不存在长度为2的路线,所以我们只能考虑长度为4的路线,路线3-1-2-5-7休息点设在2是一条平衡路线。

题解

点分治裸题(相对)
设白为-1,黑为1,则要找一条路径使得存在某个点,使得分成的两段的路径和都为0
点分治,先称每个点为普通点,若一个普通点到分治点的路径上存在一段前缀和为0,则称其为关键点(同时也是普通点)
可能与题解说法不同因为我没有看题解
通过维护每个点到分治点上路径的权值和情况可以判断一个点是否是关键点(如果当前的和在之前某个位置就出现了,那么中间的路径的和为0)
初始存在一个和为0的点(起点)
对于一条合法路径(u–分治点–v),u和v中至少有一个为关键点,且sum[u]+sum[v]=0,再加上u/v–分治点的合法情况(当且仅当该点的和为0,而且之前和为0的点至少存在2个
注意减去u和v都是关键点的情况

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define inf 2133333333
using namespace std;int a[200001][3];
int ls[100001];
int size[100001];
int bz[100001];
int b[200001]; //special
int B[200001]; //normal
int c[200001];
int b2[100001];
int B2[100001];
int n,i,j,k,l,len,min1,min2,l1,l2;
long long ans;void New(int x,int y,int z)
{++len;a[len][0]=y;a[len][1]=ls[x];ls[x]=len;a[len][2]=z;
}void dfs2(int Fa,int t)
{int i;size[t]=1;for (i=ls[t]; i; i=a[i][1])if (a[i][0]!=Fa && !bz[a[i][0]]){dfs2(t,a[i][0]);size[t]+=size[a[i][0]];}
}void dfs3(int Fa,int t,int Size)
{int i,sum=0,mx=Size;for (i=ls[t]; i; i=a[i][1])if (a[i][0]!=Fa && !bz[a[i][0]]){sum+=size[a[i][0]];mx=max(mx,size[a[i][0]]);}if (mx<min1){min1=mx;min2=t;}for (i=ls[t]; i; i=a[i][1])if (a[i][0]!=Fa && !bz[a[i][0]])dfs3(t,a[i][0],Size+sum-size[a[i][0]]+1);
}void dfs4(int Fa,int t,int s)
{int i;ans+=b[-s+100000];if (c[s+100000]){ans+=B[-s+100000]-b[-s+100000];if (!s && c[s+100000]>1)++ans;}//    ---++c[s+100000];for (i=ls[t]; i; i=a[i][1])if (a[i][0]!=Fa && !bz[a[i][0]])dfs4(t,a[i][0],s+a[i][2]);--c[s+100000];
}void dfs5(int Fa,int t,int s)
{int i;++B[s+100000];if (B[s+100000]==1)B2[++l2]=s+100000;if (c[s+100000]){++b[s+100000];if (b[s+100000]==1)b2[++l1]=s+100000;}//  ---++c[s+100000];for (i=ls[t]; i; i=a[i][1])if (a[i][0]!=Fa && !bz[a[i][0]])dfs5(t,a[i][0],s+a[i][2]);--c[s+100000];
}void dfs1(int t)
{int i;dfs2(0,t);min1=inf;dfs3(0,t,0);t=min2;bz[t]=1;l1=0;l2=0;for (i=ls[t]; i; i=a[i][1])if (!bz[a[i][0]]){++c[0+100000];dfs4(t,a[i][0],a[i][2]);dfs5(t,a[i][0],a[i][2]);--c[0+100000];}fo(i,1,l1) b[b2[i]]=0;fo(i,1,l2) B[B2[i]]=0;for (i=ls[t]; i; i=a[i][1])if (!bz[a[i][0]])dfs1(a[i][0]);
}int main()
{scanf("%d",&n);fo(i,2,n){scanf("%d%d%d",&j,&k,&l);l=l*2-1;New(j,k,l);New(k,j,l);}dfs1(1);printf("%lld\n",ans);
}

jzoj3234. 阴阳相关推荐

  1. JZOJ3234 阴阳

    题目描述 Farmer John 正在在计划自己的农场漫步.他的农场的结构就像一棵树:农场有N个谷仓(1<= N <=100,000),分别由N-1条路链接.这样,他便可以通过这些谷仓间的 ...

  2. [JZOJ3234] 阴阳

    题目 题目大意 有一棵树,每条边有000或111两种颜色. 求满足存在(u,v)(u,v)(u,v)路径上的点xxx使得(u,x)(u,x)(u,x)和(x,v)(x,v)(x,v)路径上的两种颜色出 ...

  3. Rust 阴阳谜题,及纯基于代码的分析与化简

    Rust 阴阳谜题,及纯基于代码的分析与化简 雾雨魔法店专栏 https://zhuanlan.zhihu.com/marisa 来源 https://zhuanlan.zhihu.com/p/522 ...

  4. ad10怎么挖铺的铜_一个西北阴阳的诡异经历(五六):镇兽铜虎

    喊山摄影文〡叶木喊山从龙川出发往三国古战场铁笼山方向走,要经过无数的山沟.这一带虽是山区,山多沟深,但是土地肥沃,雨水也多,种庄稼都能有收成.在以前,农村还没有拖拉机和小三轮的时候,老家人主要的运输工 ...

  5. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

  6. 第三章 阴阳的工作机制(1)

    一.道生一,一生二,二生三,三生万物 1.易有太极,是生两仪 上面,对阴阳已经讨论了很多,对这个问题已经有所了解.现在我们来讨论"阴阳的 工作机制",弄清楚这个以后对理解<伤 ...

  7. 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!

    我国是一个文明古国,虽然计算机发展技术是由西方国家发展起来的,但并不影响我国上下五千年的文明史,说二进制是有西方国家发明的,我觉得这倒是不完全正确,我国最早中医中都有阴与阳的概念,同样计算机领域中的二 ...

  8. 区别德语的公母阴阳性别的秘诀

    一次一个学德语的朋友告诉我,德语的词汇分"公母"时,我都震惊了.据他描述,德语和其他语言不同.它的名词分为阴阳中性.比如狗是公的,猫是母的,当然公猫也是母的.如果单纯看字面来翻译, ...

  9. python八卦阴阳_python 之易经启卦

    #encoding=utf-8 #这是一个易经的启卦程序,在windows下的python3.3下创建' #启卦要本着易的四原则,无事不占,不动不占,无疑不占.不能乱占. import random ...

最新文章

  1. Python正则表达式:match(),search(),findall()与finditer()的用法
  2. 20165230 《Java程序设计》实验五《网络编程与安全》实验报告
  3. 有几百万的房子,也吃不起西贝,感觉像在交税…….
  4. java collections_[20]-Collections工具类
  5. 商品预约抢购实践及redis性能测试
  6. 为了满足自己的好奇心,搞了一个业余项目耍,没想到还给我带来了$3000的收入......
  7. 网站html导出excel插件,使用JQuery插件将HTML的table标签数据导出成excel
  8. python爬取网易云歌词
  9. IT互联网的一些职位的简称
  10. 国光师傅文件上传靶场练习
  11. 电子邮箱地址如何注册?个人电子邮箱地址大全
  12. pta 天梯赛 7-3 换硬币 (20 分)day4
  13. 在线电子书阅读微信小程序 毕业设计(5)用户登录注册
  14. Android悬浮窗口开发
  15. AMD公司2020财年第三季度收益电话会议
  16. 回顾下自己的学习历程
  17. 这14个人,是程序界当之无愧的扛把子!
  18. 何伟:Solar重磅来袭
  19. Redux 使用教程
  20. 微信小程序插入HTML

热门文章

  1. 联络员(最小生成树)
  2. T2080RDB: UBoot boot vxWorks SMP
  3. 深度强化学习算法(朴素DQN,DDQN,PPO,A3C等)比较与实现
  4. popcap sexyframework - Demo1 基本框架
  5. 百分制转换为等级制(Centesimal-grade to Letter-grade)利⽤switch语句编写⼀个程序,把⽤数字表示的成绩转化为字⺟表示的等级。
  6. 稀奇!20多年前的硬盘拆解(附高清图)
  7. 计算机怎么看显卡配置,怎么查显卡配置_怎么查看自己显卡
  8. vue小黑记事本--摘抄
  9. 0x80070570文件或目录损坏且无法读取 CHKDSK修复方法
  10. 【论文笔记】基于GAN的三维医学图像跨模态配准模型 Deform-GAN