hdu 5877 - Weak Pair (2016大连网络赛) 离散化 + 树状数组

2023-11-29 05:33

本文主要是介绍hdu 5877 - Weak Pair (2016大连网络赛) 离散化 + 树状数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:给出一棵树,n个节点,每个节点有一个权值,输入一个k,问有多少对点,满足点的权值乘积小于等于k,并且其中一个点是另一个点的祖先节点。

对于每一个节点,如果这个节点的权值为a,那么找到子节点所有的权值小于等于k/a的节点数量就是满足条件的对数(a=0时就是所有子节点都满足条件)。通过树状数组对统计做一个时间优化,用dfs处理,当处理到一个节点的时候,先减去树状数组中已经有的满足条件的数量,然后然后再将所有的子孙节点统计一遍,然后加上现在满足条件的节点数量。由于输入权值很大,所以要先进行离散化,将1e9范围的数字映射到1e5范围内。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
const int MAXN = 100010;
map<long long, int> s;
map<long long, int>::iterator p;
vector<int> ch[MAXN];
int c[MAXN * 2], id[MAXN];
int mx;
long long k, ans;
void add(int u) {while(u <= mx) {c[u]++;u += u & -u;}
}
int sum(int u) {int s = 0;while(u) {s += c[u];u -= u & -u;}return s;
}
void dfs(int u) {if(id[u])ans -= sum(s[k / id[u]]);else ans -= sum(mx);for(int i = 0; i < ch[u].size(); i++)dfs(ch[u][i]);if(id[u])ans += sum(s[k / id[u]]);else ans += sum(mx);add(s[id[u]]);
}
int main() {int t, i, j, n;scanf("%d", &t);while(t--) {scanf("%d%I64d", &n, &k);for(i = 1; i <= n; i++) {ch[i].clear();}s.clear();memset(c, 0, sizeof(c));for(i = 1; i <= n; i++) {scanf("%d", &id[i]);s[id[i]] = 0;if(id[i])s[k / id[i]] = 0;}mx = 0;for(p = s.begin(); p != s.end(); p++) {p->second = ++mx;}int u, v, h;for(i = 1; i < n; i++) {scanf("%d%d", &u, &v);ch[u].push_back(v);c[v] = 1;}for(h = 1; ; h++) {if(!c[h])break;}memset(c, 0, sizeof(c));ans = 0;dfs(h);printf("%I64d\n", ans);}return 0;
}



这篇关于hdu 5877 - Weak Pair (2016大连网络赛) 离散化 + 树状数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431652

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没