LG1600 天天爱跑步
题意
分析
对一个(s,t)查询,令f=lca(s,t),则操作可化为(s,f),(f,t)。
考虑观察到的情况,若x在s到t的路径上,且x观察到,则
\[
\textrm{dep}_s-\textrm{dep}_x=w_x\\
\textrm{dep}_s=\textrm{dep}_x+w_x
\]
或者
\[
\textrm{dep}_t+\textrm{dep}_s-2\textrm{dep}_f-(\textrm{dep}_t-\textrm{dep}_x)=w_x\\
\textrm{dep}_s-2\textrm{dep}_f=w_x-\textrm{dep}_x
\]
那么相当于在x的子树中查询等于x相关的值的个数。
考虑树上差分,在s或t处加1,在f处减1,然后对每个权值建一个以dfn序为下标的线段树,维护加减1的个数。
枚举树上节点,查询子树即可。
时间复杂度\(O(m \log n + n \log n)\)
代码
注意数组的范围。
分成2条链操作的时候,1次统计f,1次不统计f。
第2种情况时为了数组下标大于0,要加上n+1。
注意fa[f]=0的情况,不应该操作线段树。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#pragma GCC optimize ("O3")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=3e5+7;
int w[MAXN],t[MAXN];
struct Edge
{
int nx,to;
}E[MAXN<<1];
int head[MAXN],ecnt;
il void addedge(rg int x,rg int y)
{
E[++ecnt].to=y;
E[ecnt].nx=head[x],head[x]=ecnt;
}
int fa[MAXN],dep[MAXN],siz[MAXN],son[MAXN];
il void dfs1(rg int x,rg int f)
{
fa[x]=f,dep[x]=dep[f]+1,siz[x]=1;
for(rg int i=head[x];i;i=E[i].nx)
{
rg int y=E[i].to;
if(y==f)
continue;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]])
son[x]=y;
}
}
int top[MAXN];
int dfn[MAXN],clk;
il void dfs2(rg int x,rg int tp)
{
top[x]=tp;
dfn[x]=++clk;
if(!son[x])
return;
dfs2(son[x],tp);
for(rg int i=head[x];i;i=E[i].nx)
{
rg int y=E[i].to;
if(y==fa[x]||y==son[x]) // edit 1
continue;
dfs2(y,y);
}
}
il int lca(rg int x,rg int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
struct Quiz
{
int s,t,lca;
}Q[MAXN];
int ans[MAXN];
int root[MAXN*3],tcnt;
int ql,qr,v;
struct SegTree
{
int sumv[MAXN*20];
int L[MAXN*20],R[MAXN*20];
il void add(rg int&now,rg int l,rg int r)
{
if(!now)
now=++tcnt;
sumv[now]+=v;
if(l==r)
return;
rg int mid=(l+r)>>1;
if(ql<=mid)
add(L[now],l,mid);
else
add(R[now],mid+1,r);
}
il int qsum(rg int now,rg int l,rg int r)
{
if(!now)
return 0;
if(ql<=l&&r<=qr)
return sumv[now];
rg int mid=(l+r)>>1;
if(qr<=mid)
return qsum(L[now],l,mid);
if(ql>=mid+1)
return qsum(R[now],mid+1,r);
return qsum(L[now],l,mid)+qsum(R[now],mid+1,r);
}
}T;
il void init()
{
tcnt=0;
memset(root,0,sizeof root);
memset(&T,0,sizeof T);
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
rg int n,m;
read(n);read(m);
for(rg int i=1,x,y;i<n;++i)
{
read(x);read(y);
addedge(x,y);
addedge(y,x);
}
for(rg int i=1;i<=n;++i)
read(w[i]);
dfs1(1,0);
dfs2(1,1);
for(rg int i=1;i<=m;++i)
{
read(Q[i].s);read(Q[i].t);
Q[i].lca=lca(Q[i].s,Q[i].t);
// cerr<<i<<" lca="<<Q[i].lca<<endl;
}
for(rg int i=1;i<=n;++i)
t[i]=w[i]+dep[i];
for(rg int i=1,now;i<=m;++i)
{
now=dep[Q[i].s];
ql=dfn[Q[i].s],v=1;
T.add(root[now],1,n);
ql=dfn[fa[Q[i].lca]],v=-1; // 此处计算lca
if(ql) // edit 2:加0会加到1上
T.add(root[now],1,n);
}
for(rg int i=1;i<=n;++i)
{
ql=dfn[i],qr=dfn[i]+siz[i]-1;
ans[i]+=T.qsum(root[t[i]],1,n);
// cerr<<i<<" ans="<<ans[i]<<endl;
}
init();
for(rg int i=1;i<=n;++i)
t[i]=w[i]-dep[i]+n+1;
for(rg int i=1,now;i<=m;++i)
{
now=dep[Q[i].s]-2*dep[Q[i].lca]+n+1;
ql=dfn[Q[i].t],v=1;
T.add(root[now],1,n);
ql=dfn[Q[i].lca],v=-1; // 此处不计算lca
T.add(root[now],1,n);
}
for(rg int i=1;i<=n;++i)
{
ql=dfn[i],qr=dfn[i]+siz[i]-1;
ans[i]+=T.qsum(root[t[i]],1,n);
// cerr<<i<<" ans="<<ans[i]<<endl;
}
for(rg int i=1;i<=n;++i)
printf("%d ",ans[i]);
// fclose(stdin);
// fclose(stdout);
return 0;
}
LG1600 天天爱跑步的更多相关文章
- 【LG1600】[NOIP2016]天天爱跑步
[LG1600][NOIP2016]天天爱跑步 题面 洛谷 题解 考虑一条路径\(S\rightarrow T\)是如何给一个观测点\(x\)造成贡献的, 一种是从\(x\)的子树内出来,另外一种是从 ...
- UOJ261 【NOIP2016】天天爱跑步
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ4719 [Noip2016]天天爱跑步
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- noip2016天天爱跑步
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...
- bzoj 4719: [Noip2016]天天爱跑步
Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要 玩家每天按时上线,完成打卡任务.这个游戏的地图可以看作一一 ...
- [NOIP]2016天天爱跑步
[NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...
- NOIP2016 天天爱跑步 80分暴力
https://www.luogu.org/problem/show?pid=1600 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养 ...
- [NOIp 2016]天天爱跑步
Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图 ...
- 【NOIP2016】【LCA】【树上差分】【史诗级难度】天天爱跑步
学弟不是说要出丧题吗>>所以我就研究了1天lca又研究了1天tj然后研究了一天天天爱跑步,终于写了出来.(最后的平均用时为240ms...比学弟快了1倍...) 题意:给你颗树,然后有m个 ...
随机推荐
- Hibernate实例
Hibernate实例 一.Hibernate简介 Hibernate是简化项目中连接数据库的一个框架工具 Hibernate是Java领域类技术成熟稳定的ORM框架 * ORM是对象关系映射 * 使 ...
- Kafka特性
———————————————————————————————————————————————— [关键原理] 1.消息文件存储(消息堆积能力) 2.消息topic分区 3.消息顺序的保证 4.拉模型 ...
- LeetCode--067--二进制求和
问题描述: 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1&quo ...
- linux中tomcat内存溢出PermGen space
1.若是部署时候,一个tomcat下面项目越少越好,单独为一个项目配置tomcat(在客户给你充足的端口的情况下) 2.在维护的时候,若一个tomcat下放多个项目的话,这时候可以把所有jar包放在t ...
- 2-24-源码编译搭建LAMP环境-作业 ( By 小甘丶 )
安装上课的内容要求: 实验环境: VMware Virtual Machine : System Version: CentOS6.8 ( Gan35 ) IP Address : 192.168.3 ...
- UVA-10655 Contemplation! Algebra (矩阵)
题目大意:给出a+b的值和ab的值,求a^n+b^n的值. 题目分析:有种错误的方法是这样的:利用已知的两个方程联立,求解出a和b,进而求出答案.这种方法之所以错,是因为这种方法有局限性.联立之后会得 ...
- spring--boot数据库连接以及class建表
Spring-Boot 数据库连接以及class建表 提前在pom.xml文件中添加:jpa,mysql资源 <dependency> <groupId>org.spring ...
- 微信小程序--登录流程梳理
前言 微信小程序凡是需要记录用户信息都需要登录,但是也有几种不同的登录方式,但是在小程序部分的登录流程是一样的.之前就朦朦胧胧地用之前项目的逻辑改改直接用了,这个新项目要用就又结合官方文档重新梳理了下 ...
- PHP:第三章——PHP中的递归函数
<?php header("Content-Type:text/html;charset=utf-8"); function A(){ static $i = 0; ++$i ...
- FZU 2124 吃豆人 bfs
题目链接:吃豆人 比赛的时候写的bfs,纠结要不要有vis数组设置已被访问,没有的话死循环,有的话就不一定是最优解了.[此时先到的不一定就是时间最短的.]于是换dfs,WA. 赛后写了个炒鸡聪明的df ...