HDU - 5877 Weak Pair (dfs+树状数组)
题目链接:Weak Pair
题意:
给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点。
题解:
刚开始看到这题,无脑暴力dfs从叶子结点向上递归,TLE了一发神清气爽@。@!所以用树状数组优化dfs,从根节点向下递归,在结点x找所有满足<=k/vec[x]的点的个数。这里因为数据很大要离散化一下,在输入的时候就把vec[x]和M/vec[x]都放数组里面,sort一下后再放到map里面。这题学了一下用树状数组优化dfs,感觉挺好的~
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
vector<int> P[MAX_N];
int in[MAX_N];
long long vec[MAX_N*];
long long vec1[MAX_N*];
long long res[MAX_N*];
long long pos[MAX_N*];
map<long long ,int > mp;
long long ans = ;
long long N,M,T;
void add(int x,long long num)
{
for(;x<*MAX_N;x+=(x&-x))
res[x] += num;
}
long long sum(int x)
{
long long ans = ;
for(;x>;x-=(x&-x))
ans += res[x];
return ans;
}
void dfs(int x)
{
ans += sum(mp[M/vec[x]]);
add(mp[vec[x]],);
for(int i=;i<P[x].size();i++)
{
dfs(P[x][i]);
}
add(mp[vec[x]],-);
}
int main()
{
cin>>T;
while(T--)
{
mp.clear();
memset(in,,sizeof(in));
memset(res,,sizeof(res));
for(int i=;i<MAX_N;i++) P[i].clear();
cin>>N>>M;
for(int i=;i<=N;i++)
{
scanf("%lld",&vec[i]);
vec1[i+N] = M/vec[i];
vec1[i] = vec[i];
}
sort(vec1+,vec1+*N+);
for(int i=;i<=*N;i++)
{
mp.insert(make_pair(vec1[i],i));
}
for(int i=;i<N-;i++)
{
int a,b;
scanf("%d%d",&a,&b);
P[a].push_back(b);
in[b] ++;
}
int point = ;
for(int i=;i<=N;i++)
{
if(!in[i])
{
point = i;
break;
}
}
ans = ;
dfs(point);
cout<<ans<<endl;
}
return ;
}
HDU - 5877 Weak Pair (dfs+树状数组)的更多相关文章
- 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. [题 ...
- 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 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Prob ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- Weak Pair (dfs+树状数组)
Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...
- HDU 5877 Weak Pair(弱点对)
HDU 5877 Weak Pair(弱点对) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Jav ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
随机推荐
- mysqlcilent的安装
这软件包是贼的气 首先是windows的安装上你必须要指定版本,linux的安装你就不需要指定版本了 windos上的指定安装必须要 一.下载包的时候需要指定版本, 比如python2的和mysq ...
- SCCM OS播发
SCCM OS播发1.在分发点启用PXE支持2.将启动映像包分发到分发点:需要将x86和x64都分发到分发点,如果只分发x64,在客户端pxe启动时会出现 no response from wds s ...
- Imagex用法
imagex用来合并/导出wim映像实例 查看wim中包含的所有单个wim实例信息,注意其中的index是唯一的,用来区分不同的wim,导出的时候也通过该index导出相应的wimimagex /in ...
- Linux 系统必须掌握的文件_【all】
0.Linux 系统文件的详解 1.Linux 系统的网络配置文件 2.Linux 系统的DNS配置文件 3.Linux 系统的IP与域名解析文件[局域网的DNS] 4.Linux 系统的主机别名文件 ...
- 禁用休眠(删除休眠文件) 关掉此选项可节省C盘好几G空间:文章内容bat文件源码
@ECHO offTITLE 关掉休眠 MACHENIKE set TempFile_Name=%SystemRoot%\System32\BatTestUACin_SysRt%Random%.bat ...
- 如何访问WEB-INFO目录中的jsp文件
说明:应用服务器把WEB-INF指为禁访目录,即直接在浏览器里是不能访问的. 如何访问如下: 1.在项目的web.xml文件中去配置servlet <servlet> <servle ...
- ssh连接CentOS7服务器
ssh原理: ssh是一种专为远程登陆会话和其他网络服务提供安全性的协议,主要用于远程登陆. ssh采用公钥加密,在远程连接时,远程主机接收到用户的登录请求,将自己的公钥发送给用户,用户使用这个公钥将 ...
- Mycat分片规则详解
1.分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下: <tab ...
- November 15th 2016 Week 47th Tuesday
Success is finding satisfaction in giving a little more than you take. 成功就是付出比得到多,仍然心满意足. Can I find ...
- November 6th 2016 Week 46th Sunday
The starting point of all achievements is desire. 成功的第一步是渴望. Those who make great achievements are o ...