BZOJ3697: 采药人的路径
不是那么裸的点分治。
$f[i][0/1]$表示当前节点的一个子树中总权值和为$i$,且是否存在一个前缀使得其前缀和为$i$
$g[i][0/1]$表示当前节点的已遍历过的子树,其余一样。
对于每个节点
$ans_{node}=g[0][0]∗f[0][0]+ \sum (g[−i][0]∗f[i][1]+g[−i][1]∗f[i][0]+g[−i][1]∗f[i][1])$
另外,Race那道题选根的方案在这里好像不是很适用,容易出问题,还是换黄学长的比较好。
//BZOJ 3697
//by Cydiater
//2016.9.26
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline int read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
,sum,root,siz[MAXN],dis[MAXN],pre[MAXN],deep[MAXN];
int maxdeep,max_siz[MAXN];
ll ans=,f[MAXN][],g[MAXN][];
bool vis[MAXN];
struct edge{
int y,next,v;
}e[MAXN];
namespace solution{
inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
void init(){
N=read();
up(i,,N){
ll x=read(),y=read(),v=read()==?-:;
insert(x,y,v);
insert(y,x,v);
}
}
void make_root(int node,int fa){
max_siz[node]=;siz[node]=;
for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
make_root(e[i].y,node);
siz[node]+=siz[e[i].y];
max_siz[node]=max(max_siz[node],siz[e[i].y]);
}
max_siz[node]=max(max_siz[node],sum-max_siz[node]);
if(max_siz[node]<max_siz[root])root=node;
}
void dfs(int node,int father){
]++;
]++;
pre[dis[node]]++;
maxdeep=max(deep[node],maxdeep);
for(int i=LINK[node];i;i=e[i].next)
if(e[i].y!=father&&!vis[e[i].y]){
deep[e[i].y]=deep[node]+;
dis[e[i].y]=dis[node]+e[i].v;
dfs(e[i].y,node);
}
pre[dis[node]]--;
}
void work(int node){
vis[node]=;g[N][]=;;
for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]){
dis[e[i].y]=e[i].v+N;deep[e[i].y]=;maxdeep=;
dfs(e[i].y,);mx=max(mx,maxdeep);
ans+=1LL*(g[N][]-)*f[N][];
up(k,-maxdeep,maxdeep)
ans+=1LL*g[N-k][]*f[N+k][]+1LL*g[N-k][]*f[N+k][]+1LL*g[N-k][]*f[N+k][];
up(j,N-maxdeep,N+maxdeep){
g[j][]+=f[j][];
g[j][]+=f[j][];
f[j][]=f[j][]=;
}
}
up(j,N-mx,N+mx)g[j][]=g[j][]=;
for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]){
root=;sum=siz[e[i].y];
make_root(e[i].y,);
work(root);
}
}
void slove(){
sum=N;root=;max_siz[root]=N;
make_root(,);
work(root);
}
void output(){
cout<<ans<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
slove();
output();
;
}
BZOJ3697: 采药人的路径的更多相关文章
- [bzoj3697]采药人的路径_点分治
采药人的路径 bzoj-3697 题目大意:给你一个n个节点的树,每条边分为阴性和阳性,求满足条件的链的个数,使得这条链上阴性的边的条数等于阳性的边的条数,且这条链上存在一个节点,这个节点到一个端点的 ...
- bzoj千题计划248:bzoj3697: 采药人的路径
http://www.lydsy.com/JudgeOnline/problem.php?id=3697 点分治 路径0改为路径-1 g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已 ...
- BZOJ3697采药人的路径——点分治
题目描述 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动.他选择的路径 ...
- BZOJ3697:采药人的路径(点分治)
Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天都要进行采药 ...
- [bzoj3697]采药人的路径——点分治
Brief Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天 ...
- BZOJ3697 采药人的路径 【点分治】
题目 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天都要进行采药活动.他选择的路径 ...
- BZOJ3697: 采药人的路径(点分治)
Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动 ...
- 2019.01.09 bzoj3697: 采药人的路径(点分治)
传送门 点分治好题. 题意:给出一棵树,边分两种,求满足由两条两种边数相等的路径拼成的路径数. 思路: 考虑将边的种类转化成边权−1-1−1和111,这样就只用考虑由两条权值为000的路径拼成的路径数 ...
- 【BZOJ3697】采药人的路径 点分治
[BZOJ3697]采药人的路径 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是 ...
随机推荐
- 一个用react+nodejs实现的笔记本小应用
寒假回家产品经理一直叮嘱着要继续做学校团队的辣个项目,但是...,我到现在一点都还没做,而且还销声匿迹躲了起来藏了几天,是的我干了票大的,想把项目用一种新的架构实现了,所以这几天一直在偷偷摸摸的做一些 ...
- Adaboost 算法的原理与推导
0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单“听取多人意见,最后综合决策”,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下午,邹博在我组织的机器学习班第8次 ...
- B树和B+树
当数据量大时,我们如果用二叉树来存储的会导致树的高度太高,从而造成磁盘IO过于频繁,进而导致查询效率下降.因此采用B树来解决大数据存储的问题,很多数据库中都是采用B树或者B+树来进行存储的.其目的就是 ...
- iOS -- autoResizingMask使用(转)
autoResizingMask 是UIView的一个属性,在一些简单的布局中,使用autoResizingMask,可以实现子控件相对于父控件的自动布局. autoResizingMask 是UIV ...
- lineNumber: 1; columnNumber: 1; 前言中不允许有内容
周六项目还能运行,也没修改什么,周一来了启动项目,竟然报错了~~~ 这是遇到的错误提示: Cause: org.xml.sax.SAXParseException; lineNumber: 1; co ...
- mybatis自动生成代码
使用maven集成mybatis-generator插件生成Mybatis的实体类,DAO接口和Map映射文件 本例中,使用的是mysql数据库 前提:表已经建好 mybatis框架的jar包,数据 ...
- 使用SFTP工具下载文件
1. 打开SFTP会话 File->Connect SFTP Session 2. cd 到文件目录下 3. get 文件名称 sftp> get catalina.out 4. lpw ...
- Oauth2.0 用Spring-security-oauth2 来实现
前言: 要准备再次研究下 统一认证的功能了,我还是觉得实现统一认证 用Oauth2 最好了,所以,现在再次收集资料和记笔记. 正文: 一.概念理解 OAuth2, 是个授权协议, RFC文档见:htt ...
- Elasticsearch静态集群配置
这两天需要将ELK中的单节点运行的ES扩展为双节点,查询了下集群配置,百度搜索结果还是一如既往的坑,基本都是各种转帖,以下记录配置静态集群的步骤: * * * <pre><code& ...
- Android Studio-目录结构
新建工程项目后AS的Product目录结构如下所示: .idea://AS生成的工程配置文件,类似Eclipse的project.properties. app://AS创建工程中的一个Module. ...