Codeforces Round #381 (Div. 1) B. Alyona and a tree (树上差分)
发布日期:2021-05-08 15:17:24 浏览次数:13 分类:精选文章

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

在这里插入图片描述
在这里插入图片描述
思路:如果v收u的控制,那么在u->v的路径中的所有点都可以控制v,,点数可以回溯求,只要在到点u的时候二分一下这条链路径上的第一个大于等于dis【u】-a【u】的点,在那个位置减1,差分一下就好。

#include 
using namespace std;typedef long long ll;const int maxn=2e5+1;ll w,a[maxn],dis[maxn],ans[maxn];vector
>g[maxn];vector
>q;void dfs(int u,int fa){ ans[u]=1; int pos=lower_bound(q.begin(),q.end(),make_pair(dis[u]-a[u],0))-q.begin(); pos--; if(pos>=0) ans[q[pos].second]--; q.push_back(make_pair(dis[u],u)); for(auto to:g[u]) { if(to.first==fa) continue; dis[to.first]=dis[u]+to.second; dfs(to.first,u); ans[u]+=ans[to.first]; } q.pop_back();}int main(){ int n,u; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%lld",&a[i]); for(int i=1;i
上一篇:Codeforces Round #346 (Div. 2) F. Polycarp and Hay(并查集+bfs)
下一篇:VK Cup 2017 - Qualification 2 C. Online Courses In BSU(dfs)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月16日 12时28分27秒