题目

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

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

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

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

分析

这是一道不错的点分治练手题目,不难很容易打。

但不知道为神马,旁边的几个逗逼ly、风筝都是很tm麻烦,细节很多。

真tm搞不懂+_+。

首先把黑白毛两种牛当做该边的边权-1或1,如果有两个点,到他们路径上某个点的距离为0,那么这就是一个合法路径。

对于一个以x为根的子树,经过x的路径\((i,j),其中deep_{i}<=deep_{j}\)有三种:

一、当i和j分别在x的两个不同的儿子为根的子树中



显然,\(k\)为中间点。

那如何计算这种情况呢?

定义\(dis_{i}\)表示x到i距离,\(d_{i}\)表示在以x为根的子树中的i的祖先是否出现过一个k点,\(dis_{k}=dis_{i}\),如果是,就为\(true\),否则为\(false\)。

我们把每个儿子分开做,这样就不用判重了。

再定义\(b_{i}\)表示,在以x为根的子树中,有多少个节点的\(dis\)值为\(i\);\(b1_{i}\)表示,在以x为根的子树中,有多少个节点的\(dis\)值为\(i\),且\(d\)值为\(true\)。

接着就可以愉愉快快地求答案了。

每个儿子用两个递归,第一个来求以x为根的子树答案,第二个来求更新\(b\)和\(b1\)。

当前递归到\(l\)点时,如果\(d_{l}=true\),那么答案加上\(b[-dis_{l}]\),否则答案加上\(b1[-dis_{l}]\)

二、i和x是同一个点



这是一种特殊情况,

显然,\(dis_{k},dis_{j}=0\),这很容易搞。

事实上,可以加点小特判,跟上一种情况一起处理,不过细节有点多,

想一想就可以解决了。

三、i不在以x为根的子树中



这种情况是不用出处理的,

因为当处理\(lca(i,j)\)时,路径\((i,j)\)会被处理掉。

//code中并没有用到d数组,可以省去
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
using namespace std;
long long d[200005],n,m,tot,dis[200005],next[200005],last[200005],to[200005],v[200005];
long long size[200005],mx[200005],root,f,ans,tt,N,b[200005],b1[200005],e[200005];
bool bz[200005],t[200005],g[200005];
long long bj(long long x,long long y,long long z)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
v[tot]=z;
}
void getroot(long long x,long long fa)
{
mx[x]=0;
size[x]=1;
for(long long i=last[x];i;i=next[i])
{
if(to[i]!=fa && bz[to[i]])
{
getroot(to[i],x);
size[x]+=size[to[i]];
mx[x]=max(mx[x],size[to[i]]);
}
}
mx[x]=max(mx[x],f-size[x]);
if (mx[x]<mx[root]) root=x;
}
long long dg1(long long x,long long fa)
{
for(long long i=last[x];i;i=next[i])
{
long long j=to[i];
if(j!=fa && bz[j])
{
if(t[dis[j]])
{
t[dis[j]]=false;
b[dis[j]]++;
dg1(j,x);
t[dis[j]]=true;
}
else
{
b1[dis[j]]++;
b[dis[j]]++;
dg1(j,x);
}
}
}
}
long long dg(long long x,long long fa)
{
for(long long i=last[x];i;i=next[i])
{
long long j=to[i];
if(j!=fa && bz[j])
{
dis[j]=dis[x]+v[i];
if(t[dis[j]])
{
if(g[dis[j]])
{
g[dis[j]]=false;
e[++tt]=dis[j];
}
t[dis[j]]=false;
ans+=b1[2*N-dis[j]];
dg(j,x);
t[dis[j]]=true;
}
else
{
ans+=b[2*N-dis[j]];
dg(j,x);
}
}
}
}
long long solve(long long x,long long fa)
{
bz[x]=false;
b[N]=1;
tt=0;
for(long long i=last[x];i;i=next[i])
{
long long j=to[i];
if(!bz[j] || j==fa) continue;
dis[j]=v[i]+N;
if(g[dis[j]])
{
g[dis[j]]=false;
e[++tt]=dis[j];
}
t[dis[j]]=false;
ans+=b1[2*N-dis[j]];
dg(j,x);
t[N]=false;
b[dis[j]]++;
dg1(j,x);
t[N]=true;
t[dis[j]]=true;
}
for(long long i=1;i<=tt;i++)
{
g[e[i]]=true;
b[e[i]]=0;
b1[e[i]]=0;
}
b[N]=0;
for(long long i=last[x];i;i=next[i])
{
long long j=to[i];
if(j!=fa && bz[j])
{
root=0;
f=size[j];
getroot(j,x);
solve(root,x);
} } }
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n-1;i++)
{
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
if(!z) z--;
bj(x,y,z);
bj(y,x,z);
}
mx[0]=maxlongint;
f=n;
N=n+1;
memset(t,true,sizeof(t));
memset(g,true,sizeof(g));
memset(bz,true,sizeof(bz));
root=0;
getroot(1,0);
ans=0;
bz[0]=false;
solve(root,0);
printf("%lld",ans);
}

【usaco 2013 open yinyang】阴阳的更多相关文章

  1. USACO翻译:USACO 2013 NOV Silver三题

    USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...

  2. USACO翻译:USACO 2013 DEC Silver三题

    USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...

  3. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

  4. USACO 2013 Nov Silver Pogo-Cow

    最近因为闲的蛋疼(停课了),所以开始做一些 USACO 的银组题.被完虐啊 TAT 貌似 Pogo-Cow 这题是 2013 Nov Silver 唯一一道可说的题目? Pogo-Cow Descri ...

  5. USACO 2013 November Contest Gold 简要题解

    Problem 1. Empty Stalls 扫两遍即可. Problem 2. Line of Sight 我们发现能互相看见的一对点一定能同时看见粮仓的某一段.于是转换成有n段线段,问有多少对线 ...

  6. BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP

    题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...

  7. [ USACO 2013 OPEN ] Photo

    \(\\\) Description 有一个长度为 \(n\) 的奶牛队列,奶牛颜色为黑或白. 现给出 \(m\) 个区间 \([L_i,R_i]\) ,要求:每个区间里 有且只有一只黑牛 . 问满足 ...

  8. BZOJ 4094 USACO 2013 Dec. Optimal Milking

    线段树 每个节点保存4个值,both表示左右端点都取,neither表示左右端点都不取,left表示只取左端点,right表示只取右端点. 维护的特殊姿势: $cur$的$both=max(ls.l+ ...

  9. USACO 2013 January Silver Painting the Fence /// oj23695

    题目大意: 输入n,k :n次操作 找到覆盖次数在k及以上的段的总长 一开始位置在0 左右活动范围为1-1000000000 接下来n行描述每次操作的步数和方向 Sample Input 6 22 R ...

随机推荐

  1. 阶段3 1.Mybatis_02.Mybatis入门案例_1.mybatis的入门

    H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2.0)-Mybatis\mybatis\mybatis_d ...

  2. centos7下执行firewall-cmd显示ImportError: No module named 'gi'

    centos7 安装tomcat 及问题处理(No module named 'gi')(Job for firewalld.service failed because the control) 2 ...

  3. 【Linux开发】./configure,make,make install的作用

    这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不是需要CC或GCC ...

  4. Java中的静态变量、静态方法、静态代码块

    转载自http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)静态方法(1)在Java里,可以定义一个不需要创建对 ...

  5. 使用certbot 为nginx或openresty启用https

    certbot 使用letsencrypt 生成免费https证书 以下内容网上整理,原文地址 https://segmentfault.com/a/1190000005797776 -------- ...

  6. mysql 修改成utf8编码

    参考文档 https://www.cnblogs.com/chenshuo/p/4743144.html

  7. [Python3] 001 "Hello World" 与注释

    目录 1. 致敬 1.1 致敬 "Hello World" 1.2 致敬 Python 之父 Guido van Rossum 2. 注释 2.1 单行注释 2.2 多行注释 3. ...

  8. 在git bash 中配置git用户名和邮箱及查看配置信息

    Administrator@LuoTong- MINGW32 ~ $ git config --global user.name "mrluotong" Administrator ...

  9. 使用CyclicBarrier+线程池,按总页数分批次开多线程执行逻辑

    通过CyclicBarrier+线程池的方式,同步的方式分页分批次并发高效处理逻辑,将总页数分成多个批次并发执行每页逻辑,每个批次处理DO_MAX_SIZE个页,每个批次等待DO_MAX_SIZE个页 ...

  10. 运用swagger编写api文档

    一.什么是swagger 随着互联网技术的发展,前后端技术在各自的道路上越走越远,他们之间的唯一联系变成了api接口,api接口文档编程了前后端人员的纽带,而swagger就是书写api文档的一款框架 ...