题目链接

http://acm.split.hdu.edu.cn/showproblem.php?pid=5877

Problem Description
You are given a rooted tree of N nodes, labeled from 1 to N. To the ith node a non-negative value ai is assigned.An ordered pair of nodes (u,v) is said to be weak if
  (1) u is an ancestor of v (Note: In this problem a node u is not considered an ancestor of itself);
  (2) au×av≤k.

Can you find the number of weak pairs in the tree?

 
Input
There are multiple cases in the data set.
  The first line of input contains an integer T denoting number of test cases.
  For each case, the first line contains two space-separated integers, N and k, respectively.
  The second line contains N space-separated integers, denoting a1 to aN.
  Each of the subsequent lines contains two space-separated integers defining an edge connecting nodes u and v , where node u is the parent of node v.

Constrains: 
  1≤N≤105 
  0≤ai≤109 
  0≤k≤1018

 
Output
For each test case, print a single integer on a single line denoting the number of weak pairs in the tree.
 
Sample Input
1
2 3
1 2
1 2
 
Sample Output
1
 
题意:输入n,k  表示有n个节点的一棵树,然后输入n个节点的权值和n-1条边,求点对(u,v)的对数,满足:
      1、u是v的祖先节点。
      2、a[u]*a[v]<=k,a[]是存储权值的数组。
 
思路:从根节点开始向下深搜,每到一个点时计算sum+=Sum(a[i]),Sum(x)表示大于等于x的个数,然后向树状数组中加入k/a[i],继续递归深搜,退栈时从树状数组中减去k/a[i] ,这样可以保证树状数组中存的一直是一条到根节点的路径值。大题思路如上,这里要做一个离散化的处理,输入的权值<=1e9  k<=1e18  而只有1e5个点,所以可以离散到2*1e5 后处理;
 
题解中提示用treap计算大于等于x的个数,这样可以不需要进行离散化;
第一次自己做出深搜的题,挺高兴的^_^  看样子我对深搜有了一点认识了
 
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
const long long maxn=;
long long root;
long long sum,k;
long long in[];
vector<long long>g[];
long long a[];
long long b[]; long long c[];
map<long long,long long>q; long long Lowbit(long long t)
{
return t&(t^(t-));
}
void add(long long x,long long t)
{
while(x > )
{
c[x]+=t;
x -= Lowbit(x);
}
}
long long Sum(long long li)
{
long long s=;
while(li<)
{
s+=c[li];
li=li+Lowbit(li);
}
return s;
} void dfs(long long t)
{
long long n=g[t].size();
for(long long i=;i<n;i++)
{
long long v=g[t][i];
sum+=(long long)Sum(q[a[v]]);
if(a[v]==) add(maxn,);
else add(q[k/a[v]],);
dfs(v);
if(a[v]==) add(maxn,-);
else add(q[k/a[v]],-);
}
} int main()
{
long long T,N;
scanf("%lld",&T);
while(T--)
{
q.clear();
memset(in,,sizeof(in));
memset(c,,sizeof(c));
memset(b,,sizeof(b));
scanf("%lld%lld",&N,&k);
for(long long i=;i<=N;i++)
{
scanf("%lld",&a[i]);
b[*i-]=a[i];
if(a[i]!=)
b[*i-]=k/a[i];
g[i].clear();
}
sort(b,b+*N);
long long tot=,pre=-;
for(long long i=;i<*N;i++)
{
if(b[i]!=pre)
{
pre=b[i];
q[pre]=++tot;
}
}
for(long long i=;i<N-;i++)
{
long long aa,bb;
scanf("%lld%lld",&aa,&bb);
g[aa].push_back(bb);
in[bb]++;
}
for(long long i=;i<=N;i++)
if(in[i]==) { root=i; break; } sum=;
if(a[root]==) add(maxn,);
else add(q[k/a[root]],);
dfs(root);
printf("%lld\n",sum);
}
return ;
}

2016 大连网赛---Weak Pair(dfs+树状数组)的更多相关文章

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

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

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

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

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

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

  4. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  5. 2016北京网络赛 hihocoder 1391 Countries 树状数组

    Countries   描述 There are two antagonistic countries, country A and country B. They are in a war, and ...

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

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

  7. 2016大连网络赛 Weak Pair

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Prob ...

  8. Weak Pair (dfs+树状数组)

    Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...

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

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

随机推荐

  1. 如何实现 Android 应用的持续部署?

    构建一个高质量的 Android 应用 最大的挑战是什么? 在整个开发流程中,也许 Coding 时莫名的 bug,也许是 Android 开发兼容性问题,多版本多渠道自动打包问题,也有开发工具选择等 ...

  2. asp.net 文件 操作方法

    /// <summary> /// 移动文件 /// </summary> /// <param name="oldPath">源文件路径< ...

  3. C#与JS实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...

  4. KnockoutJS 3.X API 第三章 计算监控属性(1) 使用计算监控属性

    计算监控属性(Computed Observables) 如果你有一个监控属性firstName,和另一个lastName,你要显示的全名?可以使用计算监控属性来实现-它依赖于一个或多个其他监控属性, ...

  5. 快速入门系列--MVC--02路由

    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

  6. Cwinux源码解析(五)

      Cwinux源码解析(五)

  7. App乱世,3721离我们有多远

    [总结]根据众多网友的评论,看来还是WP比较给力,IOS太贵...会对手机进行优化,安卓还行,如果给中老年人用WP比较好 声明:合理讨论,禁止骂人言论,本人也不是5毛党,发表下个人看法而已. 快过年了 ...

  8. Javascript定时器(二)——setTimeout与setInterval

    一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 set ...

  9. 各种排序算法的分析及java实现

    排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间 ...

  10. Nutch源码阅读进程5---updatedb

    看nutch的源码仿佛就是一场谍战片,而构成这精彩绝伦的谍战剧情的就是nutch的每一个从inject->generate->fetch->parse->update的环节,首 ...