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

71 2 03 1 1 2 4 0 5 2 0 6 3 15 7 1

Sample Output

1

Data Constraint

1<= N <=100,000

Hint

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

解析(部分摘自ZLT大佬的文)

很显然这是一道点分治,(我怎么没看出来?~_~?)

关键是一条路径上要找到一个分割点,然后两边的路都要是两种牛数量相同的。

好了分析一下吧,我们可以首先把不同牛看成是-1和1的权值。然后要找一条路径,和一个割点,使两端平衡嘛。

我们先定个根吧,当根为rx时,我们从根上发射出size_rx条路径,我们称为分路径。

现在我们要干的就是配对了。

这道题可以直接开个桶做,两条路径权值加起来等于0,就有可能在答案中。

那么现在问题来了,怎么样的路径才是合法的呢?

我们先考虑分路径。只要分路径上有一个点的权值是和端点的一样的,那么这条分路径就是有割点的了。

我们知道,由两条分路径合起来的路径,只要有一条是有割点的,这条路就合法了,淡然两个都有割点更不用说。所以就可以统计了。

还有一些特殊情况,这个就不说了。

对于一个子树,处理必须经过他路径的复杂度是size_rx的,所以就可以点分治了。

时间复杂度:O(N log N)——优秀

CODE(嘿嘿,这也是ZLT大佬的biu)

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int S=100005;
const int N=500005;
struct rec
{int sig,cnt;//cnt equal pos
}buc[N*2][2],tr[N];
int dis[N],first[N*2],next[N*2],b[N*2],pd[N],c[N*2],st[N],en[N],i,x,y,t,n,t1,tt,ttt,t2,col,vis[N],f[N],cnt[N],up[N],go[N];
ll ans;
int cr(int x,int y,int t)
{ttt++;b[ttt]=y;c[ttt]=(t==1)?1:-1;next[ttt]=first[x];first[x]=ttt;
}
int dfs(int x,int y)
{tt++;tr[tt].cnt=dis[x];if (pd[dis[x]]!=0)tr[tt].sig=1;elsetr[tt].sig=0;if (pd[dis[x]]==0)pd[dis[x]]=x;for(int p=first[x];p;p=next[p]){if(b[p]!=y&&!vis[b[p]]){dis[b[p]]=dis[x]+c[p];dfs(b[p],x);}}if (pd[dis[x]]==x)pd[dis[x]]=0;
}
int thr(int x,int y)
{cnt[x]=1;for (int p=first[x];p;p=next[p]){if (b[p]!=y&&!vis[b[p]]){thr(b[p],x);cnt[x]+=cnt[b[p]];}}
}
int find(int x,int y)
{int ret=x,tmp;f[x]=up[x];for(int p=first[x];p;p=next[p])if (b[p]!=y&&!vis[b[p]])f[x]=max(cnt[b[p]],f[x]);for(int p=first[x];p;p=next[p])if (b[p]!=y&&!vis[b[p]]){up[b[p]]=up[x]+cnt[x]-cnt[b[p]];tmp=find(b[p],x);if (f[ret]>f[tmp]) ret=tmp;}return ret;
}
ll getans()
{ll ret=0;for(int i=1;i<=t2;i++)for(int j=st[i];j<=en[i];j++){if (buc[tr[j].cnt+S][tr[j].sig].sig!=col){buc[tr[j].cnt+S][tr[j].sig].sig=col;buc[tr[j].cnt+S][tr[j].sig].cnt=1;}elsebuc[tr[j].cnt+S][tr[j].sig].cnt++;}for(int i=1;i<=t2;i++){for(int j=st[i];j<=en[i];j++)   buc[tr[j].cnt+S][tr[j].sig].cnt--;for(int j=st[i];j<=en[i];j++){if (tr[j].cnt==0&&tr[j].sig==1) ret++;if (buc[-tr[j].cnt+S][1].sig==col)ret+=buc[-tr[j].cnt+S][1].cnt;if ((tr[j].sig==1||tr[j].cnt==0)&&(buc[-tr[j].cnt+S][0].sig==col))ret+=buc[-tr[j].cnt+S][0].cnt;}}return ret;
}int solve(int x,int y)
{//printf("%d\n",&x);vis[x]=1;tt=0;t2=0;for(int p=first[x];p;p=next[p]){if (vis[b[p]]==0){//pd[0]=x;t2++;st[t2]=en[t2-1]+1;dis[b[p]]=dis[x]+c[p];dfs(b[p],x);en[t2]=tt;//pd[0]=0;}}col++;ans+=getans();for(int p=first[x];p;p=next[p]){   if (vis[b[p]]==0){thr(b[p],x);t1++;up[b[p]]=0;go[t1]=find(b[p],x);dis[go[t1]]=0;solve(go[t1],x);}}
}
int main()
{freopen("angus.in","r",stdin);freopen("angus.out","w",stdout);scanf("%d",&n);for(i=1;i<n;i++){scanf("%d%d%d",&x,&y,&t);cr(x,y,t);cr(y,x,t);}thr(1,0);t1++;go[1]=find(1,0);dis[go[1]]=0;solve(go[1],0);printf("%lld",ans);
}

jzoj 3234. 阴阳相关推荐

  1. JZOJ 5461 购物 —— 贪心

    题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历: 如果当前物品没选过,原价选上,如果选过 ...

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

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

  3. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

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

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

  5. [jzoj NOIP2018模拟 11.01]

    很庆幸打了这场模拟赛,因为这一场爆零 好像上次纪中的某场比赛我也出现了同样的问题,光是计算时间复杂度而忘记了空间的限制.想必是比上次惨的,考场上就写了两题而这两题都因为MLE爆零了.而且我T2还码了7 ...

  6. JZOJ 4421. aplusb

    4421. aplusb Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Goto ProblemSet Descr ...

  7. 【DP】小学生语文题(jzoj 5102)

    正题 jzoj 5102 题目大意 给你两个串A,B,字母个数相等,可以把B的一个字符移到前面某个位置,问你最少移多少次可以使A,B相等 解题思路 设fi,jf_{i,j}fi,j​为A匹配了i-n, ...

  8. 【二分】防具布置/秦腾与教学评估(ybtoj 二分-1-2/jzoj 1253/luogu 4403)

    正题 ybtoj 二分-1-2 jzoj 1253 luogu 4403 题目大意 给出n组数:si,ei,dis_i,e_i,d_isi​,ei​,di​ 对于每组数据,表示在sis_isi​加1, ...

  9. 【归并排序】奶牛的图片(jzoj 1812)

    奶牛的图片 jzoj 1812 题目大意 给你一个序列,你可以交换相邻的两个数 让你用最少的交换次数来使得这个序列变成形如a+1,a+2...n,1,2...a−1,aa+1,a+2...n,1,2. ...

最新文章

  1. Python3破冰人工智能,你需要掌握一些数学方法
  2. 密码错误Neo.ClientError.Security.Unauthorized: The client is unauthorized due to authentication failure
  3. 利用Eventlog Analyzer分析日志
  4. access mysql 同步_使ACCESS数据库保持同步
  5. eclispe使用外部tomcat总结
  6. 【网址收藏】Ubuntu使用OBS录制桌面时黑屏怎么办?
  7. 在 IE8 下 EXT的显示问题
  8. 优秀自我简介200字_急需稿件,稿费200元起/篇 | 公众号【深夜秘杏酱】长期征稿(可签约)...
  9. css3自适应布局单位vw,vh你知道多少?
  10. vue3 composition-api useRoute useRouter 别混淆
  11. 百行征信大揭秘,字段中间找关系
  12. JSON字符串与Map互转
  13. Atitit webserver web服务器的艺术 目录 1.1. 2.2 使用处理器处理请求 1 2. 2.5 处理器的作用域 : 2 2.1. 在Jetty中,很多标准的服务器会继承Handl
  14. elementUI的Upload的手动上传及限制数量后隐藏上传样式
  15. 为什么128KB的魂斗罗可以实现那么长的剧情?
  16. win10U盘重装无法进行,一直转圈加载,不进入安装界面超过半小时
  17. fremaker遍历list_Freemarker中如何遍历List
  18. 吸粉神器——维盟智慧wifi,微信粉丝生产基地!
  19. 《五月集训》第十四天——栈
  20. idea2017激活方式(亲测可用,良心推荐)

热门文章

  1. Bugku——可爱的故事
  2. 八面玲珑:巧用CSS为图片添加修饰点缀效果
  3. CAD二次开发(HelloCAD)
  4. python系列之:socks.GeneralProxyError: Socket error: Connection closed unexpectedly
  5. qq空间留言 php,qq空间留言背景图片 qq励志留言板留言大全
  6. Rosetta和PyRosetta的安装与使用
  7. 银行卡类型api,通过银行卡查询判断卡类型
  8. Raid10环境下的硬盘替换
  9. 如何优雅的关闭Java线程池
  10. Eclipse使用(1)Eclipse的下载以及官网版本介绍