博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1600 天天爱跑步
阅读量:5140 次
发布时间:2019-06-13

本文共 2112 字,大约阅读时间需要 7 分钟。

考虑一个玩家的路径 $(x,y)$ 对路径上的一个节点 $u$ 的贡献

设 $lca=LCA(x,y)$ ,当 $u$ 在链 $x,lca$ 上时,路径会产生 $1$ 的贡献当且仅当 $dep[x]-dep[u]=w[u]$

其中 $dep[i]$ 表示节点 $i$ 的深度,$w[i]$ 就是题目给出的 $W$,上式即 $dep[x]=dep[u]+w[u]$

当 $u$ 在链 $lca,y$ 上时,路径会产生贡献当且仅当 $dep[y]-dep[u]=dis(x,y)-w[u]$

其中 $dis(x,y)$ 表示节点 $x,y$ 的路径长度,上式即 $dep[y]-dep[u]=dep[x]+dep[y]-2dep[lca]-w[u]$

即 $-dep[x]+2dep[lca]=dep[u]-w[u]$

直接树链剖分并对每种深度维护动态开点线段树,分别维护上面两种情况,对于一条路径 $(x,y)$ 直接把对应深度的线段树的, $x$ 到 $y$ 的所有节点$+1$

即深度为 $dep[x]$ 和深度为 $-dep[x]+2dep[lca]$ ,注意这是两种情况,对每种深度都要两颗线段树分别维护

因为有第二种情况的深度可能有负数,所以要把深度加 $N$ 转成正的,变成 $2dep[lca]-dep[x]+N$,并注意这样搞 $lca$ 会被算两次,要减一次

查询节点 $u$ 时就查询深度为 $dep[u]+w[u]$ 和 $dep[u]-w[u]+N$ (注意$+N$)的线段树上节点 $u$ 的值就好了

线段树的最大节点数要注意算好,代码中线段树用标记永久化,又好写速度又快

#include
#include
#include
#include
#include
#include
using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}const int N=3e5+7;int n,m,w[N];int fir[N],from[N<<1],to[N<<1],cntt;inline void add(int a,int b) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; }int rt1[N<<1],rt2[N<<1],T[N*40],L[N*40],R[N*40],Tag[N*40],cnt;//rt1的线段树维护u在(x,lca)的情况,rt2的线段树维护u在(lca,y)的情况 void ins(int &o,int l,int r,int ql,int qr,int K){ if(!o) o=++cnt; if(l>=ql&&r<=qr) { Tag[o]+=K; return; } int mid=l+r>>1; if(ql<=mid) ins(L[o],l,mid,ql,qr,K); if(mid
>1; return ( pos<=mid ? query(L[o],l,mid,pos) : query(R[o],mid+1,r,pos) ) + Tag[o];}int son[N],Fa[N],sz[N],dep[N],Top[N],id[N],dfs_clock;void dfs1(int x){ sz[x]=1; for(int i=fir[x];i;i=from[i]) { int &v=to[i]; if(v==Fa[x]) continue; Fa[v]=x; dep[v]=dep[x]+1; dfs1(v); sz[x]+=sz[v]; if(sz[v]>sz[son[x]]) son[x]=v; }}void dfs2(int x,int tp){ id[x]=++dfs_clock; Top[x]=tp; if(son[x]) dfs2(son[x],tp); for(int i=fir[x];i;i=from[i]) { int &v=to[i]; if(v==Fa[x]||v==son[x]) continue; dfs2(v,v); }}int LCA(int x,int y){ for(;Top[x]!=Top[y];x=Fa[Top[x]]) if(dep[Top[x]]

 

转载于:https://www.cnblogs.com/LLTYYC/p/11320602.html

你可能感兴趣的文章
CSS伪类与CSS伪元素的区别
查看>>
如何:修改字符串内容
查看>>
Tomcat Server之启动---Bootstrap类
查看>>
经典问题-生产者和消费者问题
查看>>
Hadoop Distributed File System 简介
查看>>
文档通信(跨域-不跨域)、时时通信(websocket)、离线存储(applicationCache)、开启多线程(web worker)...
查看>>
常用正则表达式
查看>>
队列的基本使用方法
查看>>
解题:USACO18FEB Taming the Herd
查看>>
ACM-括号匹配问题
查看>>
使用Python中的urlparse、urllib抓取和解析网页(一)(转)
查看>>
Linux_屏蔽360、scanv、QQ管家等IP扫描
查看>>
LeetCode 538. Convert BST to Greater Tree
查看>>
@JoinColumn
查看>>
恢复linux ext4分区上误删除的文件。
查看>>
大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)...
查看>>
改变说明文档显示位置wrap
查看>>
团队作业(三):确定分工
查看>>
info.plist文件切换为Property list显示视图
查看>>
面向对象初识 ①①①
查看>>