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+树状数组)的更多相关文章

  1. 2016 大连网赛---Weak Pair(dfs+树状数组)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 Problem Description You are given a rooted ...

  2. HDU - 5877 Weak Pair (dfs+树状数组)

    题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...

  3. HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化

    http://acm.hdu.edu.cn/listproblem.php?vol=49 给定一颗树,然后对于每一个节点,找到它的任何一个祖先u,如果num[u] * num[v] <= k.则 ...

  4. HDU 5877 Weak Pair(树状数组+dfs+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: 给出一棵树,每个顶点都有权值,现在要你找出满足要求的点对(u,v)数,u是v的祖先并且a[u]*a ...

  5. HDU 5877 Weak Pair(树状数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5877 [题目大意] 给出一棵带权有根树,询问有几对存在祖先关系的点对满足权值相乘小于等于k. [题 ...

  6. codeforces 1076E Vasya and a Tree 【dfs+树状数组】

    题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...

  7. hdu 5877 (dfs+树状数组) Weak Pair

    题目:这里 题意: 给出一个n个结点的树和一个数k,每个结点都有一个权值,问有多少对点(u,v)满足u是v的祖先结点且二者的权值之积小于等于k. 从根结点开始dfs,假设搜的的点的权值是v,我们需要的 ...

  8. hdu_5877_Weak Pair(离散+DFS+树状数组)

    题目链接:hdu_5877_Weak Pair 题意: 给你一棵树,让你找有多少对满足那两个条件的weak pair 题解: 有人用Treap,我不会,然后我用树状数组+离散来替代Treap,用DFS ...

  9. CF Edu54 E. Vasya and a Tree DFS+树状数组

    Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...

随机推荐

  1. php内置函数分析之current()、next()、prev()、reset()、end()

    current()初始指向插入到数组中的第一个单元 next() 将数组的内部指针向前移动一位 prev() 将数组的内部指针倒回一位 reset() 将数组的内部指针指向第一个单元 end() 将数 ...

  2. flask之日志的配置

    1. 项目中,日志和配置文件都是单独在一个文件夹中,一般log文件夹和config文件夹,两个文件夹和manage.py在同一个目录下. 2. 配置日志前,先给flask装上script脚本扩展,Fl ...

  3. Git 使用的问题总结

    1.git stash pop 显示 xxx already exists, no checkout 当我们先使用 git stash save -u '保存信息说明' 来储藏更改,然后拉取代码 gi ...

  4. 随机森林(Random Forest,简称RF)和Bagging算法

    随机森林(Random Forest,简称RF) 随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learn ...

  5. [POJ1637]Sightseeing tour:混合图欧拉回路

    分析 混合图欧拉回路问题. 一个有向图有欧拉回路当且仅当图连通并且对于每个点,入度\(=\)出度. 入度和出度相等可以联想到(我也不知道是怎么联想到的)网络流除了源汇点均满足入流\(=\)出流.于是可 ...

  6. 转载:PICT使用教程(设计测试用例工具)

    原文:https://blog.csdn.net/quiet_girl/article/details/50699543 之前一篇写了正交设计助手的使用教程,与正交设计助手相比,个人觉得PICT的使用 ...

  7. Vim 编辑器学习笔记

    参考资料: 世界上最牛的编辑器: Vim 1

  8. flask中的Configuration为何这样写

    flask中的Configuration flask中,我们需要用到很多配置.我们知道最简单的flask是: from flask import Flask app = Flask(__name__) ...

  9. ASYNC_NETWORK_IO等待事件和调优

    测试反应测试数据库整体出现hang的情况,检查对应的等待事件,发现大量的resource_semaphore等待事件, 查看内存占用情况: ​SELECT  *  FROM    sys.dm_exe ...

  10. Retrotranslator使用简介(JDK1.5->1.4)

      Retrotranslator是一个可以把JDK1.5(6)下编译的类(或包)转译成JDK1.4下可以识别的类(包)的工具. 为现在还用JDK1.4呢?我想无非是现在的大部分Java Web应用是 ...