题目链接

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. Atitit 图像处理 灰度图片 灰度化的原理与实现

    Atitit 图像处理 灰度图片 灰度化的原理与实现 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图 ...

  2. java 线程安全 Lock

    java.util.concurrent.locks 对于线程安全我们前面使用了synchronized关键字,对于线程的协作我们使用Object.wait()和Object.notify().在JD ...

  3. java之设计模式

    一.代理模式 a.抽象角色(接口):声明真实对象和代理对象的共同接口 b.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能替 ...

  4. btn css

    .searchButtonBtn { border: 0; padding: 0 23px; height: 27px; line-height: 27px; cursor: pointer; bac ...

  5. 大型 JavaScript 应用架构中的模式

    原文:Patterns For Large-Scale JavaScript Application Architecture by @Addy Osmani 今天我们要讨论大型 JavaScript ...

  6. Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明

    本文安装显卡驱动的方式已经过时, 最新安装说明请参考发布在Gist上的这篇文章,如有任何疑问,仍然欢迎在本文下留言 :P (本文档使用同一块NVIDIA显卡进行显示与计算, 如分别使用不同的显卡进行显 ...

  7. 国内第一部C#.Net调用Matlab混合编程视频教程

       本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录:[目录]Matlab和C#混合编程文章目录 一.视频说明 2014年的5.1,我将这套视频教 ...

  8. (原创)详解KMP算法

    KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么 ...

  9. Anliven - 乱炖

    001 --- Ping Yourself! 由TCP/IP协议栈而想到的: 你的"协议分层"是如何的?有谁或者什么事务所对应着?谁先谁后,什么重要? 你的"协议栈&qu ...

  10. Windows Azure Web Site (8) 设置Web Site时区

    <Windows Azure Platform 系列文章目录> 许多已经使用Azure Web Site的用户已经发现了,Azure Web Site默认的系统时间是UTC时区. 比如我们 ...