【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang
点分治
Orz hzwer
倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误……
1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移。
然而这实在是太傻逼了,黄学长教做人:从父亲来更新儿子,走到一个节点直接更新路径的统计数,反正我们要的是【经过root的xx路径的数量】
所以可以一遍dfs直接搞出来……
2.统计方案的方式也想错了……我只考虑了以root作为中转站的路径,然而经过root的路径中,并不只有这种路径是合法的……中转站在途中某个点的也可以QwQ
另外感觉黄学长记录[-d,d]的姿势很神啊……直接数组开大一倍,然后转成[n-d,n+d]……
其他的……套模板呗- -
//BZOJ 3697
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=1e5+;
/*******************template********************/ int to[N<<],nxt[N<<],head[N],cnt,v[N<<];
void add(int x,int y,int z){
to[++cnt]=y; nxt[cnt]=head[x]; head[x]=cnt; v[cnt]=z;
to[++cnt]=x; nxt[cnt]=head[y]; head[y]=cnt; v[cnt]=z;
} int n,rt,s[N],h[N],size,dep[N],mxdeep;
LL ans,g[N*][],f[N*][];
int t[N<<],dis[N];
bool vis[N]; inline void getroot(int x,int fa){
s[x]=; h[x]=;
for(int i=head[x];i;i=nxt[i])
if (to[i]!=fa && !vis[to[i]]){
getroot(to[i],x);
s[x]+=s[to[i]];
h[x]=max(h[x],s[to[i]]);
}
h[x]=max(h[x],size-s[x]);
if (h[x]<h[rt]) rt=x;
} inline void dfs(int x,int fa){
mxdeep=max(mxdeep,dep[x]);
if (t[dis[x]]) g[dis[x]][]++;
else g[dis[x]][]++;
t[dis[x]]++;
for(int i=head[x];i;i=nxt[i])
if (!vis[to[i]] && to[i]!=fa){
dep[to[i]]=dep[x]+;
dis[to[i]]=dis[x]+v[i];
dfs(to[i],x);
}
t[dis[x]]--;
}
inline void getans(int x){
int mx=;
vis[x]=; f[n][]=;
for(int i=head[x];i;i=nxt[i])
if (!vis[to[i]]){
dis[to[i]]=n+v[i];
dep[to[i]]=;
mxdeep=;
dfs(to[i],x); mx=max(mx,mxdeep);
ans+=(f[n][]-)*g[n][];
F(j,-mxdeep,mxdeep)
ans+=f[n-j][]*g[n+j][]+f[n-j][]*g[n+j][]+f[n-j][]*g[n+j][];
//f[n][0]+1的原因是要将x作为起点or终点的合法路径(g[n][1])统计进来
F(j,n-mxdeep,n+mxdeep)
f[j][]+=g[j][],
f[j][]+=g[j][],
g[j][]=g[j][]=;
}
F(i,n-mx,n+mx) f[i][]=f[i][]=;
//统计答案↑
for(int i=head[x];i;i=nxt[i])
if (!vis[to[i]]){
rt=; size=s[to[i]];
getroot(to[i],x);
getans(rt);
}
//继续分治↑
}
int main(){
#ifndef ONLINE_JUDGE
freopen("3697.in","r",stdin);
freopen("3697.out","w",stdout);
#endif
n=getint();
F(i,,n){
int x=getint(),y=getint(),z=getint();
if (!z) z--;
add(x,y,z);
}
size=n; h[rt=]=n+;
getroot(,);
getans(rt);
printf("%lld\n",ans);
return ;
}
3697: 采药人的路径
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 252 Solved: 93
[Submit][Status][Discuss]
Description
采药人的药田是一个树状结构,每条路径上都种植着同种药材。
采药人以自己对药材独到的见解,对每种药材进行了分类。大致分为两类,一种是阴性的,一种是阳性的。
采药人每天都要进行采药活动。他选择的路径是很有讲究的,他认为阴阳平衡是很重要的,所以他走的一定是两种药材数目相等的路径。采药工作是很辛苦的,所以
他希望他选出的路径中有一个可以作为休息站的节点(不包括起点和终点),满足起点到休息站和休息站到终点的路径也是阴阳平衡的。他想知道他一共可以选择多
少种不同的路径。
Input
第1行包含一个整数N。
接下来N-1行,每行包含三个整数a_i、b_i和t_i,表示这条路上药材的类型。
Output
输出符合采药人要求的路径数目。
Sample Input
1 2 0
3 1 1
2 4 0
5 2 0
6 3 1
5 7 1
Sample Output
HINT
对于100%的数据,N ≤ 100,000。
Source
【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang的更多相关文章
- [BZOJ 3697] 采药人的路径
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3697 [算法] 首先 , 将黑色的边变成1 ,白色的边变成-1 那么 , 问题就转化 ...
- BZOJ 3697: 采药人的路径 [点分治] [我想上化学课]
传送门 题意: 路径有$-1,1$两种权值,求有多少路径满足权值和为$0$且有一个点将路径分成权值和为$0$的两段 第四节课本来想去上化学,然后快上课了这道题还没调出来.....可恶我想上化学 昨天两 ...
- bzoj 3697: 采药人的路径【点分治】
点分治,设当前处理的块的重心为rt,预处理出每个子树中f[v][0/1]表示组合出.没组合出一对值v的链数(从当前儿子出发的链),能组合出一对v值就是可以有一个休息点 然后对于rt,经过rt且合法的路 ...
- BZOJ 3697: 采药人的路径 点分治
好久不做点分治的题了,正好在联赛之前抓紧复习一下. 先把边权为 $0$ 的置为 $-1$.定义几个状态:$f[dis][0/1],g[dis][0/1]$ 其中 $f$ 代表在当前遍历的子树内的答案. ...
- BZOJ 3127 [Usaco2013 Open]Yin and Yang(树点分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3127 [题目大意] 给出一棵01边权树,求存在多少条路径,使得路径上0和1的数量相同, ...
- 【BZOJ】3697: 采药人的路径
3697: 采药人的路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1718 Solved: 602[Submit][Status][Discu ...
- bzoj3127/3697 [Usaco2013 Open]Yin and Yang
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3127 http://www.lydsy.com/JudgeOnline/problem.ph ...
- 【BZOJ-3697&3127】采药人的路径&YinandYang 点分治 + 乱搞
3697: 采药人的路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 681 Solved: 246[Submit][Status][Discus ...
- bzoj千题计划248:bzoj3697: 采药人的路径
http://www.lydsy.com/JudgeOnline/problem.php?id=3697 点分治 路径0改为路径-1 g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已 ...
随机推荐
- Mybatis通过注解方式实现批量插入数据库
原文地址:http://f0rb.iteye.com/blog/1207384 MyBatis中通过xml文件配置数据库批量操作的文章很多,比如这篇http://www.cnblogs.com/xcc ...
- 016.Zabbix聚合监控
一 Zabbix监控机汇总计算 用Calcuated Items可以对Items进行汇总计算,如求磁盘总容量.网络流量,只依赖于Zabbix-Server,与Zabbix-Agent和proxy无关. ...
- 基于jquery的简洁树形折叠菜单
先上效果图: 最小的ul就是一个最小的树枝,空间允许时可无限扩展.html如下: <div class="panel panel-default"> <div c ...
- 捕获程序异常之tryCatch
一.try catch语法try…catch…finally…语法中除了try以外,catch和finally都是可选的(两者必须要有一个),也就是说try…catch…finally…语法有以下三种 ...
- 「LOJ 556 Antileaf's Round」咱们去烧菜吧
「LOJ 556 Antileaf's Round」咱们去烧菜吧 最近在看 jcvb 的生成函数课件,顺便切一切上面讲到的内容的板子题,这个题和课件上举例的背包计数基本一样. 解题思路 首先列出答案的 ...
- 【转】InitializingBean的作用
原文链接:http://blog.csdn.net/maclaren001/article/details/37039749 最近工作需要得到sping中的每个事物需要执行的sql,称机会简单研究了一 ...
- 使用 IntraWeb (2) - Hello IntraWeb
IntraWeb 比我相像中的更贴近 VCL, 传统的非可视组件在这里大都可用(其内部很多复合属性是 TStringList 类型的), 它的诸多可视控件也是从 TControl 继承下来的. 这或许 ...
- 用ViewPager实现一个程序引导界面
下面使用ViewPager来实现一个程序引导的demo: 一般来说,引导界面是出现第一次运行时出现的,之后不会再出现.所以需要记录是否是第一次使用程序,办法有很多,最容易想到的就是使用SharedPr ...
- HDU 4770 Lights Against Dudely (2013杭州赛区1001题,暴力枚举)
Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- [Go] 反射 - reflect.ValueOf()
类型 和 接口 由于反射是基于类型系统(type system)的,所以先简单了解一下类型系统. 首先 Golang 是一种静态类型的语言,在编译时每一个变量都有一个类型对应,例如:int, floa ...