CodeForces 739B Alyona and a tree (二分+树上差分)
<题目链接>
题目大意:
给定一颗带权树,树的根是1,树上每个点都有点权,并且还有边权。现在给出“控制”的定义:对一个点u,设v为其子树上的节点,且$dis(u,v)≤val[v]$,则称u控制v。求出每个点控制的点数。
解题分析:
处理出所有点到根的距离$dist$,然后任意两点之间的距离为$dist[v]-dist[u]$($v$为$u$的子树中的节点)。因为在每条链上,$dist$由根向子树深搜的过程中都是递增的,所以可以用二分快速找到能够控制当前节点的$dep$最浅的父亲节点,然后利用树上差分进行高效的个数统计。
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- template<typename T>
- inline void read(T&x){
- x=;int f=;char ch=getchar();
- while(ch<'' ||ch>''){ if(ch=='-')f=-; ch=getchar(); }
- while(ch>='' && ch<=''){ x=x*+ch-''; ch=getchar(); }
- x*=f;
- }
- #define REP(i,s,t) for(int i=s;i<=t;i++)
- #define fi first
- #define se second
- #define pb push_back
- typedef long long ll;
- const int N = 2e5+;
- int n,m,cnt,loc[N];
- ll val[N],dist[N],sum[N],dfn[N];
- typedef pair<int,ll>P;
- vector<P>G[N];
- //sum[i]表示每个点能够管辖的节点数
- void dfs(int u){
- dfn[++cnt]=dist[u];loc[cnt]=u;
- int cur=lower_bound(dfn+,dfn++cnt,dist[u]-val[u])-dfn;//dist[v]-dist[u]<=val[v] ===>dist[v]-val[v]<=dist[u] //找到能够管辖这个点的深度最浅的祖先节点
- sum[loc[cur-]]--;
- for(auto &e:G[u]){
- int v=e.fi;ll cost=e.se;
- dist[v]=dist[u]+cost;
- dfs(v);
- sum[u]+=sum[v]+;
- }
- --cnt; //将这个链分支中的点全部删除
- }
- int main(){
- read(n);
- REP(i,,n)read(val[i]);
- REP(i,,n){
- int u,w;read(u);read(w);
- G[u].pb(P(i,(ll)w));
- }
- dfs();
- REP(i,,n)printf("%lld ",sum[i]);
- }
CodeForces 739B Alyona and a tree (二分+树上差分)的更多相关文章
- XJOI 3363 树4/ Codeforces 739B Alyona and a tree(树上差分+路径倍增)
D. Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 739B Alyona and a tree(树上路径倍增及差分)
题目链接 Alyona and a tree 比较考验我思维的一道好题. 首先,做一遍DFS预处理出$t[i][j]$和$d[i][j]$.$t[i][j]$表示从第$i$个节点到离他第$2^{j}$ ...
- 【CF739B】Alyona and a tree(树上差分,二分,树形DP)
题意:给出一棵有根树,树上每个点.每条边都有一个权值. 现在给出“控制”的定义:对一个点u,设点v在其子树上,且dis(u,v)≤av,则称u控制v. 要求求出每个点控制了多少个点 n (1 ≤ n ...
- Codeforces 682C Alyona and the Tree (树上DFS+DP)
题目链接:http://codeforces.com/problemset/problem/682/C 题目大意:取树上任意一个点v,若点v的子树中有一个点u使得dist(v,u)>a[u]那么 ...
- CodeForces 682C Alyona and the Tree (树上DFS)
题意:给定一棵树,每个叶子有一个权值,每条边也有一个权值,现在让你删最少的结点,使得从任何结点出发到另一个结点的边上权值和都小于两个结点的权值. 析:很明显是DFS,不过要想找出最少的结点可能不太容易 ...
- Codeforces E. Alyona and a tree(二分树上差分)
题目描述: Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- P2680 运输计划(二分+树上差分)
P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...
- P2680 运输计划 二分+树上差分
又咕咕了几天\(QwQ\) 思路:二分+树上差分 提交:\(\geq5\)次 错因:\(lca\)写错+卡了很久常数(哪位大佬帮我康康,有更好的写法请指出\(QwQ\)) 题解: 我们先将原问题转化为 ...
随机推荐
- python实现通过企业微信发送消息
实现了通过企业微信发送消息,平时用于运维的告警还是不错的,相对于邮件来说,实时性更高,不过就是企业微信比较麻烦,此处不做过多解释. 企业微信api的详细请看:http://work.weixin.qq ...
- Codeforces917E
//#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #i ...
- Conservation Vs Non-conservation Forms of conservation Equations
What does it mean? The reason they are conservative or non-conservative has to do with the splitting ...
- wine安装与配置
1. 安装wine32dpkg --add-architecture i386 && apt-get update && apt-get install wine3 ...
- 【leetcode】402. Remove K Digits
题目如下: 解题思路:我的方法是从头开始遍历num,对于任意一个num[i],在[i+1~len(num)-1]区间内找出离num[i]最近并且小于num[i]的数num[j],如果j-i <= ...
- tensorflow2.0 squeeze出错
用tf.keras写了自定义层,但在调用自定义层的时候总是报错,找了好久才发现问题所在,所以记下此问题. 问题代码 u=tf.squeeze(tf.expand_dims(tf.expand_dims ...
- Tomcat的配置文件server.xml叙述
元素名属性解释 server port 指定一个端口,这个端口负责监听关闭tomcat的请求shutdown 指定向端口发送的命令字符串 servicename 指定service ...
- vue定义组件
1.定义组件 2.在App.vue里引入Home组件 home代码 <template> <div>home</div> </template> < ...
- Spring源码解读--(一)源码下载
走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...
- Sending form data
https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data This arti ...