洛谷P1600 天天爱跑步——树上差分
题目:https://www.luogu.org/problemnew/show/P1600
看博客:https://blog.csdn.net/clove_unique/article/details/53427248
思路好神啊...
树上差分是好东西。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=;
int n,m,head[maxn],ct,w[maxn],tp,fp,ans[maxn],f[maxn][],h[maxn],dfn[maxn],tim,a[maxn<<];
struct P{int t,pt,val;}tor[maxn<<],fr[maxn<<];
struct N{
int to,next;
N(int t=,int n=):to(t),next(n) {}
}edge[maxn<<];
void add(int x,int y){edge[++ct]=N(y,head[x]); head[x]=ct;}
bool cmp(P x,P y){return dfn[x.pt]<dfn[y.pt];}
void init(int x,int fa)
{
h[x]=h[fa]+; f[x][]=fa; dfn[x]=++tim;
for(int i=;i<=;i++)
f[x][i]=f[f[x][i-]][i-];
for(int i=head[x],u;i;i=edge[i].next)
if((u=edge[i].to)!=fa)init(u,x);
}
int lca(int x,int y)
{
if(h[x]<h[y])swap(x,y);
int k=h[x]-h[y];
for(int i=;i>=;i--)
if(k&(<<i))x=f[x][i];
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
if(x==y)return x;
return f[x][];
}
void dfs1(int x,int f)
{
int val=w[x]+h[x],dec=a[val];
while(tp<=(m<<) && tor[tp].pt==x) a[tor[tp].t + h[x]]+=tor[tp].val, tp++;
for(int i=head[x],u;i;i=edge[i].next)
if((u=edge[i].to)!=f)dfs1(u,x);
ans[x]+=a[val]-dec;
}
void dfs2(int x,int f)
{
int val=w[x]-h[x]+,dec=a[val];
while(fp<=(m<<) && fr[fp].pt==x) a[fr[fp].t]+=fr[fp].val, fp++;
for(int i=head[x],u;i;i=edge[i].next)
if((u=edge[i].to)!=f)dfs2(u,x);
ans[x]+=a[val]-dec;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
init(,);
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int i=,s,t;i<=m;i++)
{
scanf("%d%d",&s,&t);
int r=lca(s,t);
tor[++tp].pt=s; tor[tp].t=; tor[tp].val=;
if(r!=)tor[++tp].pt=f[r][], tor[tp].t=h[s]-h[r]+, tor[tp].val=-;
fr[++fp].pt=t; fr[fp].t=h[s]-h[r]-h[r]+; fr[fp].val=;
fr[++fp].pt=r; fr[fp].t=h[s]-h[r]-h[r]+; fr[fp].val=-;
} sort(tor+,tor+tp+,cmp); tp=;
sort(fr+,fr+fp+,cmp); fp=;
dfs1(,);
memset(a,,sizeof a);
dfs2(,);
for(int i=;i<=n;i++)printf("%d ",ans[i]);
return ;
}
洛谷P1600 天天爱跑步——树上差分的更多相关文章
- 洛谷$P1600$ 天天爱跑步 树上差分
正解:树上差分 解题报告: 传送门$QwQ$! 这题还挺妙的,,,我想了半天才会$kk$ 首先对一条链$S-T$,考虑先将它拆成$S-LCA$和$LCA-T$,分别做.因为总体上来说差不多接下来我就只 ...
- 洛谷P1600 天天爱跑步(线段树合并)
小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn ...
- 洛谷 P1600 天天爱跑步
https://www.luogu.org/problemnew/show/P1600 (仅做记录) 自己的假方法: 每一次跑从a到b:设l=lca(a,b)对于以下产生贡献: a到l的链上所有的点( ...
- 洛谷P1600 天天爱跑步
天天放毒... 首先介绍一个树上差分. 每次进入的时候记录贡献,跟出来的时候的差值就是子树贡献. 然后就可以做了. 发现考虑每个人的贡献有困难. 于是考虑每个观察员的答案. 把路径拆成两条,以lca分 ...
- 洛谷 P1600 天天爱跑步(LCA+乱搞)
传送门 我们把每一条路径拆成$u->lca$和$lca->v$的路径 先考虑$u->lca$,如果这条路径会对路径上的某一个点产生贡献,那么满足$dep[u]-dep[x]=w[x] ...
- 洛谷P1600 天天爱跑步(差分 LCA 桶)
题意 题目链接 Sol 一步一步的来考虑 \(25 \%\):直接\(O(nm)\)的暴力 链的情况:维护两个差分数组,分别表示从左向右和从右向左的贡献, \(S_i = 1\):统计每个点的子树内有 ...
- 洛谷P1600 天天爱跑步——题解
题目传送 首先要考虑入手点.先考虑一个一个玩家处理,显然不加优化的话,时间复杂度是O(n)的.发现对于玩家路径上的点都有一个观察员,一个都不能忽视,看起来是很难优化了.在做题时,发现一个思路很难想,就 ...
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- [NOIP 2016D2T2/Luogu P1600] 天天爱跑步 (LCA+差分)
待填坑 Code //Luogu P1600 天天爱跑步 //Apr,4th,2018 //树上差分+LCA #include<iostream> #include<cstdio&g ...
随机推荐
- python 用 PIL 模块 画验证码
PIL 简单绘画 def get_code_img(request): from PIL import Image, ImageDraw, ImageFont import random def ra ...
- JQuery Easy UI 简介
[什么是JQuery Easy UI?] jQuery EasyUI 是一组基于 jQuery 的 UI 插件集合,而 jQuery EasyUI 的目标就是帮助Web 开发者更轻松的打造出功能丰富并 ...
- jsp+servlet+mysql增删改查
用的IntelliJ IDEA开发的,jdk1.8 1 首先是项目结构,如下图所示 2看各层的代码 首先是web.xml <?xml version="1.0" encodi ...
- sql 日期问题从周转换到日期
alter procedure p_date@year int=2005, --年份@week int=33, --第几周@firstday datetime =null output, ...
- Quartz进一步学习与使用
一.再思考 了解Quartz.NET的基本使用方法了.但如果想方便的知道某个作业执行情况,需要暂停,启动等操作行为,这时候就需要个Job管理的界面,如何才能达到我们想到的效果,查看相关Quartz.n ...
- mysql用户自定义变量
可以先在用户变量中保存值然后在以后引用它:这样可以将值从一个语句传递到另一个语句.用户变量与连接有关.也就是说,一个客户端定义的变量不能被其它客户端看到或使用.当客户端退出时,该客户端连接的所有变量将 ...
- csu - 1538: Shopping (贪心)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1538 很奇妙的一个题,开始没有思路.问了别人才知道. 题目的意思可以理解成上图中,从0点开始向右走 ...
- codevs——1031 质数环
1031 质数环 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个大小为N(N<=17 ...
- Servlet的服务端响应
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/server-response.html: 当一个Web服务器对浏览器响应一个HTTP请求时,响应 ...
- centos7grub2 引导win10
centos7+win10安装完成之后,使用gurb2引导win10系统 方式:使用ntfs-3g 步骤: 1.加源 wget -O /etc/yum.repos.d/epel.repo http: ...