洛谷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 ...
随机推荐
- (转载)Catalan数——卡特兰数
Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...
- Direct3D 12 创建windows窗口
之前列出了计算机图形学的计划,现在开始这一阶段的学习,首先是Windows窗口的创建. 创建windows窗口 环境: 1. Visual Studio 2015 新建项目 创建工程项目完成,确定为窗 ...
- CodeForces 221D Little Elephant and Array
Little Elephant and Array Time Limit: 4000ms Memory Limit: 262144KB This problem will be judged on C ...
- 1004. 成绩排名 (20) (快速排序qsort函数的使用问题)
读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...
- Web App 响应式页面制作 笔记整理
一.移动端种类.分辨率大小 说明: 以主流的iPad.iPhone为例. 工具: Resizer官网: Resizer 用法: 将通栏处写有 “Click or Bookmark”的蓝色按钮拖拽至标签 ...
- codeforces 762E(cdq分治)
题意: n个电台,每个电台有三个属性xi, ri, fi.分别代表电台的坐标,电台的播报范围,以及播报的频率. 对于一对电台i, j,若min(ri, rj) >= |xi - xj|,那么他们 ...
- HttpClientUtil 工具类 实现跨域请求数据
package com.xxx.common.util; import java.io.IOException; import java.net.URI; import java.util.Array ...
- iis站点内存泄漏问题分析
在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...
- 洛谷 P1023 税收与补贴问题
P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...
- Ubuntu 16.04硬盘有坏道,开机显示blk_update_request:I/0 error
可以尝试以下方式解决: 1.检查坏道(效果明显,但是比较慢,检查出来并没有什么用,只是知道有坏块) sudo badblocks -s -v -o /root/bb.log /dev/sda1 2.快 ...