bzoj3127/3697 [Usaco2013 Open]Yin and Yang
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3127
http://www.lydsy.com/JudgeOnline/problem.php?id=3697
【题解】
点分治。
f[i,0/1]表示前面一坨路径和为i,是否存在休息站。
分类讨论:休息站在点分的地方,休息站在前面子树,休息站在当前子树
子树合并的时候顺便算一发贡献即可。
# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + ;
const int mod = 1e9+; # define RG register
# define ST static int n; ll ans = ;
int head[M], nxt[M], to[M], w[M], tot=;
bool vis[M]; inline void add(int u, int v, int _w) {
++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v; w[tot] = _w;
}
inline void adde(int u, int v, int _w) {
add(u, v, _w); add(v, u, _w);
} int sz[M], mx[M];
inline void dfsSize(int x, int fa = ) {
sz[x] = ; mx[x] = ;
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa || vis[to[i]]) continue;
dfsSize(to[i], x);
sz[x] += sz[to[i]];
if(sz[to[i]] > mx[x]) mx[x] = sz[to[i]];
}
} int centre = , mi;
inline void dfsCentre(int x, int tp, int fa = ) {
if(sz[tp] - sz[x] > mx[x]) mx[x] = sz[tp] - sz[x];
if(mx[x] < mi) mi = mx[x], centre = x;
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa || vis[to[i]]) continue;
dfsCentre(to[i], tp, x);
}
} int t[M];
ll f[M][], g[M][];
int mxd, vmin = 1e9, vmax = ;
// g: cur tree, f: all
inline void dfsAns(int x, int v, int fa) {
if(t[v]) g[v][] ++;
else g[v][] ++;
t[v] ++;
vmin = min(vmin, v), vmax = max(vmax, v);
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa || vis[to[i]]) continue;
dfsAns(to[i], v+w[i], x);
}
t[v] --;
} inline void calcAns(int x) {
int Vmin = 1e7, Vmax = ;
f[n][] = ;
for (int i=head[x]; i; i=nxt[i]) {
if(vis[to[i]]) continue;
vmin = 1e7, vmax = ;
dfsAns(to[i], n+w[i], x);
Vmin = min(Vmin, vmin), Vmax = max(Vmax, vmax);
ans += (f[n][]-) * g[n][]; //啥都不动,没有1,是没有意义的,为了计数方便,前面先赋值1.
for (int j=vmin-n; j<=vmax-n; ++j)
// 将g合并到f上,统计答案
ans += f[n-j][] * g[n+j][] + f[n-j][] * g[n+j][] + f[n-j][] * g[n+j][];
for (int j=vmin; j<=vmax; ++j) {
f[j][] += g[j][];
f[j][] += g[j][];
g[j][] = g[j][] = ;
}
}
for (int j=Vmin; j<=Vmax; ++j) f[j][] = f[j][] = ;
} inline void dfs(int x) {
dfsSize(x);
mi = n; dfsCentre(x, x);
// cross the centre
calcAns(centre);
// ================
vis[centre] = ;
for (int i=head[centre]; i; i=nxt[i]) {
if(!vis[to[i]]) dfs(to[i]);
}
} int main() {
scanf("%d", &n);
for (int i=; i<n; ++i) {
int u, v, _w; scanf("%d%d%d", &u, &v, &_w);
adde(u, v, _w ? : -);
}
dfs();
printf("%lld\n", ans);
return ;
}
把0/1记录1/-1会方便很多啊不过注意下标+n
bzoj3127/3697 [Usaco2013 Open]Yin and Yang的更多相关文章
- BZOJ 3127 [Usaco2013 Open]Yin and Yang(树点分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3127 [题目大意] 给出一棵01边权树,求存在多少条路径,使得路径上0和1的数量相同, ...
- 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang
点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...
- BZOJ3127:[USACO2013OPEN]Yin and Yang
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...
- 洛谷P3085 [USACO13OPEN]阴和阳Yin and Yang(点分治,树上差分)
洛谷题目传送门 闲话 偶然翻到一道没有题解的淀粉质,想证明一下自己是真的弱 然而ZSYC(字符串组合)早就切了 然后证明成功了,WA到怀疑人生,只好借着ZSY的代码拍,拍了几万组就出来了... 思路 ...
- Yin and Yang Stones(思路题)
Problem Description: A mysterious circular arrangement of black stones and white stones has appeared ...
- 【BZOJ-3697&3127】采药人的路径&YinandYang 点分治 + 乱搞
3697: 采药人的路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 681 Solved: 246[Submit][Status][Discus ...
- Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)
https://files.cnblogs.com/files/Winniechen/usaco2012-2013.pdf 做的不是很好,还请见谅! 如果有什么疑问,可以QQ上找我. QQ号:1967 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- AssetBundle loading failed because.....已解决
http://blog.csdn.net/ldghd/article/details/9632455 ***************************** 一 ******* ...
随机推荐
- dispaly:-webkit-box 布局中的坑
dispaly:-webkit-box 具体用法 这里大家可以网上查, 这里说下里面的坑 里面的子对象设置-webkit-box-flex: 1 -webkit-box-flex: 2 时:一般两个子 ...
- 杀死 tomcat 进程的脚本
新建一个.sh 文件 把下面的内容复制进去.然后 把这个文件放到tomcat 的bin目录下在关闭tomcat 执行这个脚本. 可以解决 在关闭tomcat的时候 总是遗留一些tomcat进程没有结束 ...
- Windows Server2003下安装IIS服务脑图
在练习过程中,勾选“ASP.NET”后开始安装时提示要插入安装光盘,但是我安装系统时是用镜像文件在虚拟机里安装的,所以根据提示界面的提示从文件中选择相应文件复制,如下图点击确定,选择iisapp.vb ...
- day-8 python自带库实现ID3决策树算法
前一天,我们基于sklearn科学库实现了ID3的决策树程序,本文将基于python自带库实现ID3决策树算法. 一.代码涉及基本知识 1. 为了绘图方便,引入了一个第三方treePlotter模块进 ...
- kvm-1
yum install libvirt* virt-* qemu-kvm* -y systemctl start libvirtd.service systemctl status libvirtd. ...
- mongodb数据库操作之简单查询
1. 2. 3.修改器 默认一条一条修改 4. 5.查询 6.mysql简单操作
- UVA 11884 A Shooting Game(记忆化搜索)
A and B are playing a shooting game on a battlefield consisting of square-shaped unit blocks. The bl ...
- lintcode-49-字符大小写排序
49-字符大小写排序 给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序. 注意事项 小写字母或者大写字母他们之间不一定要保持在原始字符串中的相对位置. 样例 给出"abAc ...
- iOS-tableViewCell创建时添加一些动画
有时候因为项目的需要,给tableView添加一些动画: cell.layer.transform = CATransform3DMakeScale(); [UIView animateWithDur ...
- 配置Mac自带的Apache http服务器
Mac系统是自带Apache,所以很方便我们做一些http测试. 我可以先启动默认的服务器 $ sudo apachectl start 在浏览器打开:http://localhost 将会看到下面信 ...