title

BZOJ 4719

LUOGU 1600

简化题意:

小c同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。《天天爱跑步》是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。

这个游戏的地图可以看作一一棵包含 \(n\) 个结点和 \(n-1\) 条边的树, 每条边连接两个结点,且任意两个结点存在一条路径互相可达。树上结点编号为从 \(1\) 到 \(n\) 的连续正整数。

现在有 \(m\) 个玩家,第 \(i\) 个玩家的起点为 \(S_i\) ,终点为 \(T_i\) 。每天打卡任务开始时,所有玩家在第 \(0\) 秒同时从自己的起点出发,以每秒跑一条边的速度,不间断地沿着最短路径向着自己的终点跑去,跑到终点后该玩家就算完成了打卡任务。 (由于地图是一棵树,所以每个人的路径是唯一的)

小c想知道游戏的活跃度,所以在每个结点上都放置了一个观察员。 在结点 \(j\) 的观察员会选择在第 \(W_j\) 秒观察玩家,一个玩家能被这个观察员观察到当且仅当该玩家在第 \(W_j\) 秒也理到达了结点 \(j\) 。 小C想知道每个观察员会观察到多少人?

注意:我们认为一个玩家到达自己的终点后该玩家就会结束游戏,他不能等待一 段时间后再被观察员观察到。 即对于把结点 \(j\) 作为终点的玩家:若他在第 \(W_j\) 秒前到达终点,则在结点 \(j\) 的观察员不能观察到该玩家;若他正好在第 \(W_j\) 秒到达终点,则在结点 \(j\) 的观察员可以观察到这个玩家。

analysis

对于一个人,他的路程会分为两段,一段向上(根),一段向下,考虑在向上过程中他能产生贡献的观察者具有什么性质:设出发点深度为 \(dep[x]\),观察者深度为 \(dep[y]\),观察的时间为 \(t\),需满足 \(dep[x]−dep[y]=t\),换句话说就是 \(dep[y]+t=dep[x]\) 。向下那一段的推导类似,下面的部分也只以向上的路径为例来解释。

现在我们记录每个点下方出发点深度为 \(dep[x]\) 的人数,需要对于每个出发点更新出发点到出发点与目的地的 \(lca\) 的所有点,想到到开一颗权值线段树,用线段树合并不断把信息往上传,在 \(lca\) 处消除这次更新的影响,这样一来直接我们就可以在树上统计答案了。向下路径的处理与向上路径类似。

code

#include<bits/stdc++.h>const int maxn=3e5+10;namespace IO
{char buf[1<<15],*fs,*ft;inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }template<typename T>inline void read(T &x){x=0;T f=1, ch=getchar();while (!isdigit(ch) && ch^'-') ch=getchar();if (ch=='-') f=-1, ch=getchar();while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();x*=f;}char Out[1<<24],*fe=Out;inline void flush() { fwrite(Out,1,fe-Out,stdout); fe=Out; }template<typename T>inline void write(T x,char str){if (!x) *fe++=48;if (x<0) *fe++='-', x=-x;T num=0, ch[20];while (x) ch[++num]=x%10+48, x/=10;while (num) *fe++=ch[num--];*fe++=str;}
}using IO::read;
using IO::write;int ver[maxn<<1],Next[maxn<<1],head[maxn],len;
inline void add(int x,int y)
{ver[++len]=y,Next[len]=head[x],head[x]=len;
}namespace SGT
{struct Orz{int l,r,z;}c[maxn*60];int num=0;inline void Change(int &x,int l,int r,int k,int z){if (!x) x=++num;c[x].z+=z;if (l==r) return ;int mid=(l+r)>>1;if (k<=mid) Change(c[x].l,l,mid,k,z);else Change(c[x].r,mid+1,r,k,z);}inline int query(int x,int l,int r,int k){if (l==r) return c[x].z;int mid=(l+r)>>1;if (k<=mid) return query(c[x].l,l,mid,k);else return query(c[x].r,mid+1,r,k);}inline int merge(int x,int y){if (!x) return y;if (!y) return x;c[x].l=merge(c[x].l,c[y].l);c[x].r=merge(c[x].r,c[y].r);c[x].z=c[x].z+c[y].z;return x;}
}using SGT::Change;
using SGT::query;
using SGT::merge;namespace lca
{int dfn[maxn],id;int f[maxn][21],dep[maxn];inline void dfs(int x){dfn[x]=++id;for (int i=1; i<=20; ++i) f[x][i]=f[f[x][i-1]][i-1];for (int i=head[x]; i; i=Next[i]){int y=ver[i];if (y==f[x][0]) continue;f[y][0]=x;dep[y]=dep[x]+1;dfs(y);}}inline int LCA(int x,int y){if (dep[x]>dep[y]) std::swap(x,y);for (int i=20; i>=0; --i)if (dep[y]-(1<<i)>=dep[x]) y=f[y][i];if (x==y) return x;for (int i=20; i>=0; --i)if (f[x][i]^f[y][i]) x=f[x][i],y=f[y][i];return f[x][0];}
}using lca::dfs;
using lca::LCA;
using lca::dep;
using lca::f;int tot,n,m,u[maxn],v[maxn];
int ans[maxn],w[maxn];
inline void get(int x)
{for (int i=head[x]; i; i=Next[i]){int y=ver[i];if (y==f[x][0]) continue;get(y);u[x]=merge(u[x],u[y]), v[x]=merge(v[x],v[y]);}ans[x]=query(u[x],1,tot,dep[x]+w[x])+query(v[x],1,tot,w[x]-dep[x]+n);
}int main()
{read(n);read(m); tot=n<<1;for (int i=1,x,y; i<n; ++i) read(x),read(y),add(x,y),add(y,x);for (int i=1; i<=n; ++i) read(w[i]);dfs(1);for (int i=1,x,y; i<=m; ++i){read(x),read(y);int a=LCA(x,y);Change(u[x],1,tot,dep[x],1);Change(u[a],1,tot,dep[x],-1);Change(v[y],1,tot,dep[x]-(dep[a]<<1)+n,1);Change(v[f[a][0]],1,tot,dep[x]-(dep[a]<<1)+n,-1);}get(1);for (int i=1; i<=n; ++i) write(ans[i],' '); *IO::fe--;//防 BZOJIO::flush();return 0;
}

转载于:https://www.cnblogs.com/G-hsm/p/11426646.html

BZOJ 4719: [Noip2016]天天爱跑步 线段树合并相关推荐

  1. [NOIp2016]天天爱跑步 线段树合并

    [NOIp2016]天天爱跑步 LG传送门 作为一道被毒瘤出题人们玩坏了的NOIp经典题,我们先不看毒瘤的"动态爱跑步"和"天天爱仙人掌",回归一下本来的味道. ...

  2. NOIP2016 天天爱跑步 线段树合并

    题意: 给出一棵n个点的树,以及m次操作,每次操作从起点向终点以每秒一条边的速度移动(初始时刻为0),最后对于每个点询问有多少次操作在经过该点的时刻为某值. (题面太毒瘤建议自己去题库食用) 分析: ...

  3. 【NOIP2016】【桶/线段树合并】【树上差分】天天爱跑步

    [题目描述] [思路] 这是道好题呀.考虑把一条路径(u,v)拆成两条:从u到lca(u,v),从lca(u,v)到v.下面我们以向上的路径为例讨论做法.对于一条向上的路径,它对一个点x有贡献当且仅当 ...

  4. [noip2016]天天爱跑步(主席树+lca)

    恩..在百度的第一页翻了翻,没有用主席树做的,于是打算水一篇blog: 天天爱跑步 首先有一个解题的关键: 将玩家的向上和向下分成两部分: 先定义几个变量,s是起点,t是终点,wi是每个观察员出现的时 ...

  5. NOIP2016天天爱跑步

    NOIP2016天天爱跑步 这题一看显然lca+树上差分,但是因为有w的限制不能直接加,所以考虑权值线段树合并, 每个选手的起点终点对于不同的节点的影响是不同的,这就非常麻烦了,但是可以发现无论如何他 ...

  6. [NOIP2016]天天爱跑步 题解(树上差分) (码长短跑的快)

    Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要 玩家每天按时上线,完成打卡任务.这个游戏的地图 ...

  7. [NOIP2016]天天爱跑步(lca+乱搞)

    2557. [NOIP2016]天天爱跑步 时间限制:2 s   内存限制:512 MB [题目描述] 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑 ...

  8. UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)

    NOI2019考前做NOI2018题.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=5417 (luogu) http ...

  9. BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)...

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

最新文章

  1. Go 语言编程 — Context 上下文
  2. 羊皮卷的实践-第二十一章
  3. 高龄申请海外计算机科学博士,【原创】牛津在读小博谈谈在海外攻读生命科学专业的一些心得...
  4. c#.net实体类序列化方法  为什么要序列化
  5. ubuntu系统debootstrap的使用之二:启动
  6. python能学到什么-学习python三个月能学到什么?
  7. php相册上传和删除吗,php上传与删除图片的简单范例
  8. [DSF] Devices Syndication Foundation Architecture V1
  9. Pwn-2018_HITB_CTF-gundam
  10. android qq聊天界面键盘与布局,大屏手机单手聊天 QQ输入法浮动键盘做得到
  11. python有道字典_【Python】Python利用有道翻译开发API应用示例
  12. SpringBoot - OAuth2第三方登录之QQ登录
  13. 电力-端口映射与才茂DTU通信
  14. 软件设计模式“单例模式”和“工厂模式”
  15. 2021年安全员-B证(江西省)新版试题及安全员-B证(江西省)考试技巧
  16. Astah 9.0升级步骤(Widnows/Mac OS)
  17. MySQL | 普通索引和唯一索引,应该怎么选择?
  18. 远程连接工具PuTTY和MTPuTTY
  19. 核心库aud$过大清理
  20. 解决:Unknown custom element: <> - did you register the component correctly? For recursive compon

热门文章

  1. [软考] 计算机技术与软件专业技术资格考试之扫盲贴
  2. 【Python气象绘图临摹】处理数据(上):读入输出nc数据、截取夏季/冬季数据、ButterWorth带通滤波、计算方差
  3. APP获取手机验证码防止短信轰炸解决办法
  4. matlab学习矩阵1
  5. 设计行业高效办公秘籍——趁手的设计软件
  6. web服务器监控工具
  7. 身临其境文化之旅——VR全景图片畅游世界各地文化景点
  8. 搅局电子书,盛大通吃“化友为敌”
  9. 【第19章】操作系统安全保护(信息安全工程师) 软考笔记
  10. JAVA输入五中水果英文名称_用英语写所有水果的名称要附带汉语