Weak Pair (dfs+树状数组)
Weak Pair (dfs+树状数组)
题意
这个题目是要求:一颗树上,有n个节点,给出每个节点的权值。另外给出一个值k,问有多少对节点满足:
- \(power[u]*power[v]<=k\)
- u是v节点的祖先(u不等于v)
解题思路
这个可以找父节点权值满足小于或者等于\(\frac{k}{power[v]}\)(注意这里可能不能够整除)
我们从根节点出发,一个一个地遍历,走到一个节点就看它前面的父节点有没有符合条件的。这个可以使用树状数组来进行求解,在已经去完重和排好序的数组中查找满足条件节点的位置,和当前节点的位置,注意这里使用的是upper_bound,因为上面的条件可能不能够整除,使用lower_bound不够精确。
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const ll inf=1e18;
const int maxn=1e5+7;
vector<int> g[maxn];
int sum[maxn];
ll power[maxn];
ll lishan[maxn];
int vis[maxn];
int n, cnt, ans;
ll k;
int lowbit(int x)
{
return x&(-x);
}
int update(int x, int v)
{
while(x<=cnt+1)
{
sum[x]+=v;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ret=0;
while(x>0)
{
ret+=sum[x];
x-=lowbit(x);
}
return ret;
}
void dfs(int rt)
{
int len=g[rt].size();
int pos;
if(power[rt]==0) pos=cnt+1;
else pos=upper_bound(lishan+1, lishan+cnt+1, k/power[rt])-(lishan);
int posthis=upper_bound(lishan+1, lishan+cnt+1, power[rt])-(lishan);
ans+=getsum(pos);
update(posthis, 1);
for(int i=0; i<len; i++)
{
dfs(g[rt][i]);
}
update(posthis, -1);
}
void init()
{
ans=0;
for(int i=0; i<=n; i++)
{
vis[i]=0;
g[i].clear();
sum[i]=0;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%lld", &n, &k);
init();
for(int i=1; i<=n; i++)
{
scanf("%lld", &power[i]);
lishan[i]=power[i];
}
sort(lishan+1, lishan+n+1);
cnt=unique(lishan+1, lishan+n+1)-(lishan+1);
int a, b;
for(int i=1; i<n; i++)
{
scanf("%d%d", &a, &b);
g[a].push_back(b);
vis[b]=1;
}
for(int i=1; i<=n; i++)
{
if(!vis[i])
{
dfs(i);
break;
}
}
printf("%d\n", ans);
}
return 0;
}
Weak Pair (dfs+树状数组)的更多相关文章
- 2016 大连网赛---Weak Pair(dfs+树状数组)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 Problem Description You are given a rooted ...
- HDU - 5877 Weak Pair (dfs+树状数组)
题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...
- HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化
http://acm.hdu.edu.cn/listproblem.php?vol=49 给定一颗树,然后对于每一个节点,找到它的任何一个祖先u,如果num[u] * num[v] <= k.则 ...
- HDU 5877 Weak Pair(树状数组+dfs+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: 给出一棵树,每个顶点都有权值,现在要你找出满足要求的点对(u,v)数,u是v的祖先并且a[u]*a ...
- HDU 5877 Weak Pair(树状数组)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5877 [题目大意] 给出一棵带权有根树,询问有几对存在祖先关系的点对满足权值相乘小于等于k. [题 ...
- codeforces 1076E Vasya and a Tree 【dfs+树状数组】
题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...
- hdu 5877 (dfs+树状数组) Weak Pair
题目:这里 题意: 给出一个n个结点的树和一个数k,每个结点都有一个权值,问有多少对点(u,v)满足u是v的祖先结点且二者的权值之积小于等于k. 从根结点开始dfs,假设搜的的点的权值是v,我们需要的 ...
- hdu_5877_Weak Pair(离散+DFS+树状数组)
题目链接:hdu_5877_Weak Pair 题意: 给你一棵树,让你找有多少对满足那两个条件的weak pair 题解: 有人用Treap,我不会,然后我用树状数组+离散来替代Treap,用DFS ...
- CF Edu54 E. Vasya and a Tree DFS+树状数组
Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...
随机推荐
- DUBBO原理、应用与面经总结
研读dubbo源码已经有一段时间了,dubbo中有非常多优秀的设计模式和示例代码值得学习,但是dubbo的调用层级和方法链都较为繁杂,如果不对源码思路进行梳理则很容易忘却,因此总结一篇研读心得,从阅读 ...
- pyqt5-橡皮筋控件QRubberBand
提供一个矩形或线来指示选择或边界 一般结合鼠标事件一同协作 继承于 QWidget import sys from PyQt5.QtWidgets import QApplication, QWidg ...
- 打包组件assembly之package.xml
形如: <assembly> <id>deploy</id> <formats> <format>zip</format> &l ...
- 查询重复数据group by menu_id having count(menu_id)>1
select * from sys_power_menu WHERE menu_id in ( select menu_id from sys_power_menu group by menu_id ...
- jQuery ajax - ajaxSetup() 方法
实例 为所有 AJAX 请求设置默认 URL 和 success 函数: $("button").click(function(){ $.ajaxSetup({url:" ...
- C++ 对象间通信框架 V2.0 ××××××× 之(三)
类定义:CSignalSlot ======================================================================= // SignalSlo ...
- es之java删除文档操作
删除文档操作 @Test public void deleteDocument(){ DeleteResponse response = client.prepareDelete("twit ...
- 关于VMware 15搭建MacOS 10.14后无法播放在线视频和客户端视频的问题
最近在自己的电脑上搭建了MacOS10.14系统,搭建是成功了,但是发现一个很坑的事,看视频发现黑屏.就是那种只有声音,没有视频的问题,在多个浏览器上和客户端都是一样的.百度了下,总结有2种可能,一是 ...
- open 函数处理文件
open函数用于文件处理 操作文件时,一般需要经历如下步骤:1 打开文件 2 操作文件 f = open("文件名" , ' 打开文件方式' ) 文件句柄 ...
- Fabric基础架构原理(二)
Fabric 的网络节点本质上是互相复制的状态机,节点之间需要保持相同的账本状态.为了实现这个目的,各个节点需要通过共识( consensus )过程,对账本状态的变化达成一致性的认同. Fabric ...