HDU 5877 Weak Pair(树状数组+dfs+离散化)
2024-10-15 02:44:19
http://acm.hdu.edu.cn/showproblem.php?pid=5877
题意:
给出一棵树,每个顶点都有权值,现在要你找出满足要求的点对(u,v)数,u是v的祖先并且a[u]*a[v]<=k。
思路:
转化一下,a[v]<=k/a[u],k/a[u]的最大值也就是k/a[v],也就是寻找<=k/a[v]的个数,到这儿,是不是很像树状数组?
我们只需要从根开始dfs,插入到树状数组中,并且查询即可。注意这道题目需要离散化一下。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
const int maxn=1e6+; ll n,k,m;
ll ans;
ll a[maxn];
ll b[maxn];
ll c[maxn];
int degree[maxn]; vector<int> G[maxn]; int lowbit(int x)
{
return x&-x;
} int sum(int x)
{
int ret = ;
while(x>)
{
ret+=c[x]; x-=lowbit(x);
}
return ret;
} void add(int x, int d)
{
while(x<=m)
{
c[x]+=d;
x+=lowbit(x);
}
} void dfs(int u, int fa)
{
int update_pos=lower_bound(b+,b+m+,a[u])-b;
int query_pos;
if(a[u]) query_pos=lower_bound(b+,b+m+,k/a[u])-b;
else query_pos=m;
ans+=sum(query_pos);
add(update_pos,);
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(v==fa) continue;
dfs(v,u);
}
add(update_pos,-);
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
memset(c,,sizeof(c));
memset(degree,,sizeof(degree));
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;i++) {G[i].clear();scanf("%lld",&a[i]);b[i]=a[i];} m=n;
for(int i=;i<=n;i++)
{
if(a[i]) b[++m]=k/a[i];
} sort(b+,b+m+);
m=unique(b+,b+m+)-(b+); for(int i=;i<=n-;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
degree[v]++;
} ans=;
for(int i=;i<=n;i++)
if(degree[i]==) dfs(i,-);
printf("%lld\n",ans);
}
return ;
}
最新文章
- 基于OpenCV 的iOS开发
- 使用微软CORS包不能跨域访问的问题
- mongodb学习4---索引
- Java基本概念(未完)
- PHP之preg_replace()与ereg_replace()正则匹配比较讲解
- springmvc整合redis架构搭建实例
- DS4700存储日志收集
- Git merge local repository
- JQuery UI 封装了一些常用模板
- 【DG】[三思笔记]一步一步学DataGuard
- IE浏览器兼容
- worknote
- 5.2Python数据处理篇之Sympy系列(二)---Sympy的基本操作
- 开发一个简单的chrome插件-解析本地markdown文件
- 疑难杂症:Java中Scanner连续获取int和String型发生错误.
- Tomcat映射虚拟路径到指定磁盘(eclipse)
- CF451E
- C#检测本机是否联网
- 数据分析之Matplotlib
- Codeforces 817
热门文章
- PAT 1019 General Palindromic Number[简单]
- JavaScrip总体
- Android中Activity的四种开发模式
- CentOS系统下的数据盘挂载
- Set keys=Map.keyset()
- VUE滚动条插件——vue-happy-scroll
- 摘要JSR168 PORLET标准手册汉化整理
- 无法在web服务器下启动调试
- 并发写Btree原理剖析
- python excel操作 练习-#操作单列 #操作A到C列 #操作1到3行 #指定一个范围遍历所有行和列 #获取所有行 #获取所有列