【BZOJ 3697】采药人的路径
题目链接:
题解:
调了好久233。
大概想一想就是树分,然后考虑这样路径(u,v)的特征,以根节点(root)切开,u到root的阴阳差值,和v到root巧合互为相反数,然后考虑要有一个点可作为休息点,即u/v到root的路径中要有一点x与u/v到root的阴阳差值相同,然后维护一下就好。
注意的是阴阳差为0的特判……写挂了调好久,对拍也不好写,真是恶心。
代码:
#define Troy 11/23
#define inf 0x7fffffff #include <bits/stdc++.h> using namespace std; inline int read(){
int s=,k=;char ch=getchar();
while(ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while(ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=1e5+; typedef long long ll; int n; struct edges{
int v,w;edges *last;
}edge[N<<],*head[N];int cnt; inline void push(int u,int v,int w){
edge[++cnt]=(edges){v,w,head[u]};head[u]=edge+cnt;
} int tot,root,heavy[N],size[N],top,num,T[N<<][],nT[N<<],pre[N<<]; ll ans,t[N<<][]; bool vis[N]; inline void dfs(int x,int fa){
size[x]=,heavy[x]=;
for(edges *i=head[x];i;i=i->last)if(!vis[i->v]&&i->v!=fa){
dfs(i->v,x);
heavy[x]=max(heavy[x],size[i->v]);
size[x]+=size[i->v];
}
heavy[x]=max(heavy[x],tot-size[x]);
if(top>heavy[x])
top=heavy[x],root=x;
} #define g(s) t[s+n]
#define G(s) T[s+n]
#define f(s) pre[s+n] inline void update(int x,int s,int fa){
bool a=f(s)>;
if(G(s)[a]!=num)
G(s)[a]=num,g(s)[a]=;
++g(s)[a];
++f(s);
for(edges *i=head[x];i;i=i->last)if(!vis[i->v]&&i->v!=fa)
update(i->v,s+(i->w?:-),x);
--f(s);
} inline void calc(int x,int s,int fa){
bool a=f(s)>;
++f(s);
if(G(s)[]==num)
ans+=g(s)[];
if(a&&G(s)[]==num){
ans+=g(s)[];
if(!s&&f(s)<=) ans-=g(s)[];
}
for(edges *i=head[x];i;i=i->last)if(!vis[i->v]&&i->v!=fa)
calc(i->v,s+(i->w?-:),x);
--f(s);
}
inline void solve(int x){
top=inf;
dfs(x,x);
vis[x=root]=true;
G()[]=++num;
g()[]=;
for(edges *i=head[x];i;i=i->last)if(!vis[i->v]){
calc(i->v,i->w?-:,x);
update(i->v,i->w?:-,x);
}
for(edges *i=head[x];i;i=i->last)if(!vis[i->v]){
tot=size[i->v];
solve(i->v);
}
} int main(){
n=read();
for(int i=,u,v,w;i^n;++i){
u=read(),v=read(),w=read();
push(u,v,w);
push(v,u,w);
}
tot=n;
f()=;
solve();
printf("%lld\n",ans);
}
【BZOJ 3697】采药人的路径的更多相关文章
- [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】3697: 采药人的路径
3697: 采药人的路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1718 Solved: 602[Submit][Status][Discu ...
- 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang
点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...
- bzoj千题计划248:bzoj3697: 采药人的路径
http://www.lydsy.com/JudgeOnline/problem.php?id=3697 点分治 路径0改为路径-1 g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已 ...
- 【BZOJ-3697&3127】采药人的路径&YinandYang 点分治 + 乱搞
3697: 采药人的路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 681 Solved: 246[Submit][Status][Discus ...
- BZOJ3697: 采药人的路径
传送门 不是那么裸的点分治. $f[i][0/1]$表示当前节点的一个子树中总权值和为$i$,且是否存在一个前缀使得其前缀和为$i$ $g[i][0/1]$表示当前节点的已遍历过的子树,其余一样. 对 ...
- BZOJ_3697_采药人的路径_点分治
BZOJ_3697_采药人的路径_点分治 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性 ...
随机推荐
- 怎样看Mac的日志
Mac自带的日志查看工具Console,注意Console和Terminal不是一码事,后者是CLI环境,前者是GUI日志查看工具.在应用里面搜索Console即可找到,里面的界面和Windows的日 ...
- andorid下从相册选取/拍照选取一张相片并剪切
http://www.2cto.com/kf/201401/270144.html 在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多 之前的一篇文章只说到如何从相册 ...
- javascript封装的参数合并
o=$.extend(initializationInterface.defaultValue,o); o= $.extend({}, initializationInterface.prototyp ...
- 解决0% [Waiting for headers] 导致的unable to lock the administration directory (/var/lib/dpkg/) is another process using it
这是我在配置vim的YouCompleteMe时遇到的问题,我需要使用CMake来编译YCM. 在我输入 $ sudo apt install cmake 由于网络原因导致安装一直卡在0% [Wait ...
- vim快捷键汇总
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...
- 微信小程序 bug及解决方案
1.小程序遮罩滚动穿透问题 解决方案: <view class="mask" wx:if="{{showVipRights}}" catchtap='hi ...
- mybatis查询异常-Error querying database. Cause: java.lang.ClassCastException: org.apache.ibatis.executor.ExecutionPlaceholder cannot be cast to java.util.List
背景,mybatis查询的时候直接取的sqlsession,没有包装成SqlSessionTemplate,没有走spring提供的代理. 然后我写的获取sqlsession的代码没有考虑到并发的情况 ...
- PAT1047: Student List for Course
1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- 怎么确定Oracle客户端安装成功
可通过能否登录sqlplus来判断是否安装成功. 操作系统:windows10 oracle版本:oracle 11g 步骤: 1.电脑win键+R键,输入cmd,进入命令提示符. 2.命令行中输入: ...
- HBuilder 插件开发(openinstall 集成)
离线打包 如果要集成使用非基座包下的第三方 SDK,就必须使用离线打包.可以参考 官方文档 进行离线打包,如果嫌官方文档看不懂,可以查看 其他技术人员的教程 开发插件 编写 Android 原生代码 ...