Weak Pair (HDU - 5877 ,DFS + 离散化 + 权值线段树)

矩阵LED和矩阵按键 先说矩阵LED,如图: 下面以行几、列几的表达方法说明 三极管可以当做开关使用 由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。 如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。 解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环 阅读详情

一.题目链接:

HDU-5877

二.题目大意:

一棵树,每个节点有一个权值 a[i]。

一个 weak对(u, v) 需满足:

① u 是 v 的祖先

② a[u] \times a[v] \leq k

问有多少个 weak 对.

三.分析:

dfs 一棵树,对于当前节点 v 来说,只需找权值 ≤ k / a[v] 的祖先有多少个.

权值线段树查询,每经过一个点便将 a[u] 的次数 + 1,结束时将 a[u] 的次数 - 1.

由于 k 过大,这里还需要离散化.

详见代码.

四.代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e5;
const ll inf = 0x3f3f3f3f3f3f3f3f;

int n, m;
int a[M + 5];
bool in[M + 5];
ll ans, k, b[M * 2 + 5];

int cnt;
int head[M + 5];
struct enode
{
    int v, nx;
}Edge[M + 5];

int tree[M * 8 + 5];

void init(int n)
{
    m = ans = cnt = 0;
    for(int i = 1; i <= n; ++i)
    {
        in[i] = 0;
        head[i] = -1;
    }
}

void add(int u, int v)
{
    Edge[cnt].v = v;
    Edge[cnt].nx = head[u];
    head[u] = cnt++;
}

inline int lc(int k)
{
    return k<<1;
}

inline int rc(int k)
{
    return k<<1|1;
}

void build(int k, int l, int r)
{
    tree[k] = 0;
    if(l == r)
        return;
    int mid = (l + r) >> 1;
    build(lc(k), l, mid);
    build(rc(k), mid + 1, r);
}

int query(int k, int l, int r, int a, int b)
{
    if(l >= a && r <= b)
        return tree[k];
    int mid = (l + r) >> 1;
    int sum = 0;
    if(a <= mid)
        sum += query(lc(k), l, mid, a, b);
    if(mid < b)
        sum += query(rc(k), mid + 1, r, a, b);
    return sum;
}

void update(int k, int l, int r, int pos, int v)
{
    if(l == r)
    {
        tree[k] += v;
        return;
    }
    int mid = (l + r) >> 1;
    if(pos <= mid)
        update(lc(k), l, mid, pos, v);
    else
        update(rc(k), mid + 1, r, pos, v);
    tree[k] = tree[lc(k)] + tree[rc(k)];
}

void dfs(int u)
{
    int r = lower_bound(b + 1, b + m + 1, a[u] ? k / a[u] : inf) - b;
    ans += query(1, 1, m, 1, r);
    int pos = lower_bound(b + 1, b + m + 1, a[u]) - b;
    update(1, 1, m, pos, 1);
    for(int i = head[u]; ~i; i = Edge[i].nx)
        dfs(Edge[i].v);
    update(1, 1, m, pos, -1);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d %lld", &n, &k);
        init(n);
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d", &a[i]);
            b[++m] = a[i], b[++m] = (a[i] ? k / a[i] : inf);
        }
        sort(b + 1, b + m + 1), m = unique(b + 1, b + m + 1) - (b + 1);
        build(1, 1, m);
        for(int i = 1, u, v; i < n; ++i)
        {
            scanf("%d %d", &u, &v);
            in[v] = 1;
            add(u, v);
        }
        for(int i = 1; i <= n; ++i)
        {
            if(!in[i])
            {
                dfs(i);
                break;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

 

Lumerical 教程,包含作者个人理解及相关设计案例 (目前共计184篇,持续更新中) 4138。 阅读详情

相关推荐

python数据分析与可视化

Python数据分析主要包括数据清洗、数据探索和数据可视化三个部分。数据清洗是数据分析的重要环节,主要是对数据进行预处理,包括缺失值处理、异常值处理、数据类型转换等。数据探索则是通过对数据进行初步分析,了解数据的分布和特征,为后续的数据分析提供基础。数据可视化则是将数据以图形化的方式呈现,帮助人们更好地理解和分析数据。

2301_82032652的博客 7714

【33.18%】【hdu 5877】Weak Pair (3种解法)

Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1637Accepted Submission(s): 531 Problem Description You are given arootedtr...

190

博途AI助手演示,完成简单且重复的梯形图代码,并导入到博途

自写个博途AI助手,下面演示AI帮我生成完善多个模拟量输入转换的代码,

gsjkwg的博客 1529

HDU5877 Weak Pair

题目链接:HDU5877 Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 687    Accepted Submission(s): 236 Problem Description

teddywang 592

Windows下Python调用D435i相机避坑指南:从SDK版本选择到RealSense Viewer报错解决

本文详细介绍了在Windows环境下使用Python调用Intel D435i相机的完整避坑指南。重点解决了SDK版本选择问题,推荐使用稳定的Intel RealSense SDK 2.54.2版本,并提供了从环境配置、常见报错解决到实际应用案例的全流程实践指导,帮助开发者高效完成相机部署与开发。

palm99的专栏 924

特征提取 Features Extraction

介绍了特征提取的基本概念,从分类变量,文本信息和图片信息中进行特征提取的方法,以及实现特征提取的类库

JasonH2021的博客 1万+

HDU 5877 Weak Pair

题意;求所有点的祖先节点中与他的权值的乘积小于k 的个数的和; 思路:我们在从祖先节点开始进行DFS, 当跑到该节点时,在线段树中查找比k/val[u] 小的权值的个数,并在线段树中该权值对应的点+1, 当回溯的时候该点权值的位置在-1。 由于权值的范围较大,可以先将权值离散化,或者直接建立一颗手动分配内存的线段树,如果离散化树状数组也可解,当然维护一个set也是可以的。 代码: #inc

moon_NO2015的博客 461

万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

Coding... 1万+

hdu 5877 Weak Pair dfs + 线段树(or树状数组)

// hdu 5877 Weak Pair dfs + 线段树(or树状数组) // // 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 // // 题目大意: // n个节点到有根树,u是v的祖先,每个节点有个权值a[u].求 // a[u] * a[v] <= k的有序对的数量。 // // 解答: //

TIMELIMITE的专栏 797

YOLOv11改进 | Neck篇 | 双向特征金字塔网络BiFPN助力YOLOv11有效涨点

本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进YOLOv11模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带来的结构可以让大家自行调节网络结构大小,同时能够达到一定的轻量化效果,为什么发BiFPN呢因为它算是YOLO系列改进中的常青树了,大家可以借鉴它的双向特征思想来创新自己的Neck结构本文的BiFPN通过yaml文件配置可以让大家自行调配其结构。

Snu77的博客 9104

YOLOv12环境配置,手把手教你使用YOLOv12训练自己的数据集和推理(附YOLOv12网络结构图),全文最详细教程

YOLO 系统尊嘟太卷了吧,YOLOv11 还没完明白,YOLOv12 就重磅来袭,YOLOv12 是由纽约州立大学联合中科院在 2025年2月19 日发布,从 YOLOv12 论文题目我们大概就知道做了那些更新 ,下图是YOLOv12 在 COCO 数据集上的性能表现引入区域注意力机制(area-attention):通过引入十字形窗口自我注意机制,沿水平和垂直条纹计算注意力机制,纵横交错的注意机制。如下图所示,区域注意力采用最多简单的等分方法,将特征地图垂直或水平划分为 L 个区域。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6万+

hdu5877 Weak Pair(dfs+线段树+离散化)

给定一棵有根树(注意跟不一定是1.。。),求有序对(u,v)满足的个数: 1.u是v的祖先 2.a[u]*a[v]<=k。 我们在对树进行dfs时,做到v点,此时在我们的dfs栈中的点正是v的祖先,一个不多,一个不少,我们只需在这些点中找到小于等于k/a[v]的点。显然可以把权值离散化了,用线段树来维护

Icefox的博客 375

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 985

HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)

Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1468    Accepted Submission(s): 472 Problem Description You are given a

Dacc123的博客 1258

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[HDOJ5877]Weak Pair(DFS,线段树,离散化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意:给一棵树和各点的权值a,求点对(u,v)个数,满足:1.u是v的祖先,2.a(u)*a(v)<=k。 对于这棵树,我们先存好树的结构。再离散化,最后dfs的时候往线段树里插点,那对应idx的值就是1。然后二分找不大于k/a[v]的下标,线段树统计计数就行了。换儿子的时候记得抹去上...

weixin_30471561的博客 107

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hdu5877 Weak Pair

Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1556    Accepted Submission(s): 501 Problem Description You are given a

overload1997 568

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

hdu5877 Weak Pair(离散化+线段树+dfs)

题目:一棵有n个节点的树,每个点有一个权值。给出k,要求找出树上有多少个数对 (u,v) 满足如下条件: u是v的祖先。(u,v不同) au∗av≤ka_u*a_v\leq k 分析:利用dfs的过程,在dfs遍历一棵树的时候,若此时在v点,那么可以保证的是v点所有的祖先都已经被遍历了。所以,我们可以把v之前的点加入线段树,到v的时候直接查询出在祖先中有多少个≤av\leq a_v。但是,有一些点

nbl97 297

HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)...

Weak Pair Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1468Accepted Submission(s): 472 Problem Description You are given aroot...

weixin_30512785的博客 179

Cupcake Bonuses(UCF Local Programming Contest 2018 E,dfs序 + 线段树)

一.题目链接: Cupcake Bonuses 二.题目大意: 初始有一个员工,有四种操作: 1 i:给第 i 员工一个员工. 2 i m:把第 i 号员工的工资系数置为 m. 3 i b:给第 i 号员工及其所有下属基金为 b 的工资,每个人的实际所获工资等于 基金b * 这个人的工资系数. 4 i:查询第 i 号员工当前已获得的实际工资. 三.分析: 这题直接暴力即可.(比赛...

The___Flash的博客 800

Tunnel Warfare (HDU - 1540,这也能用线段树 ?!)

一.题目链接: HDU-1540 二.题目大意: 有 n 个村庄排列在一条线上,编号为 1 ~ n. 现有 3 种 m 次操作 D x:摧毁第 x 个村庄 Q x:查询与第 x 个村庄相邻的村庄数. R:修复上一个被摧毁的村庄. 三.分析: 当查询与第 x 个村庄相邻的村庄数时 只需要查询在 1 ~ x 中被摧毁村庄的最大编号 && 在 x ~ n 中被摧毁村...

The___Flash的博客 420

Neko and sequence(HDU - 6539,树状数组维护奇怪の东西♂)

一、题目链接: Neko and sequence 二、题目大意 给一个长度为 nnn 且字符集为 {′(′,′)′}\{'(', ')'\}{′(′,′)′} 的字符串 sss,下标从 000 开始标号. 还给出一个整数 qqq 和一个整数 kkk. 定义走一步:对于每一个 i  (0≤i≤n−1)i \; (0 \leq i \leq n - 1)i(0≤i≤n−1),若 s[i]==′(′s[i] == '('s[i]==′(′,则走一步到达 (i−k+n)%n(i - k + n) \% n(i−k

The___Flash的博客 414

Snowy Smile (HDU - 6638,稀疏矩阵子矩阵最大和)

一.题目链接: HDU-6638 二.题目大意: 求稀疏矩阵子矩阵最大和. 三.分析: 离散 x 坐标,枚举 x. 线段树维护区间最大子段和 将的算法优化到了 详见代码. 四.代码实现: #include <set> #include <map> #include <ctime> #include <queue> #inc...

The___Flash的博客 388

Vases and Flowers (HDU - 4614,线段树 + 二分 + 思维)

一.题目链接: HDU-4614 二.题目大意: 有 N个花盆,起初都没有花. 1 个花盆只能插 1 朵花. 有 m 次 2 种操作. ① 1 A F:从第 A 花盆开始插 F 朵花,多余的丢弃. 若一朵花都无法插入,则输出 "Can not put any one." 否则,输出插花的起点、终点. ② 2 A B:将 A ~ B 花盆中的花丢弃,并输出所丢弃的花的个数. 三...

The___Flash的博客 374

Transformation( HDU - 4578 ,多重懒惰标记线段树 + 思维)

一.题目链接: HDU-4578 二.题目大意: n 个数 a[1 ~ n]. 现有 m 次 4 种操作. 1 l r c:a[l ~ r] 都 + c 2 l r c:a[l ~ r] 都 × c 3 l r c:a[l ~ r] 都变为 c 4 l r p:查询(p = {1, 2, 3}) 三.分析: 由上述公式便可得每次更新后的 [1, 3]次幂的和....

The___Flash的博客 318

Interval GCD(算法竞赛进阶指南,拓展更相减损之术 + 差分数组 + 线段树)

一.题目链接: Interval GCD 二.题目大意: 有一个长度为 n 的数组 A. 现有两种操作: ① 使数组 A 中区间 [l, r] 的元素都加 d. ② 求出数组 A 中区间 [l, r] 的元素的最大公约数. 三.分析: 操作 ② 很明显是用线段树来实现,重点在操作 ①. 操作① 可以用懒惰标记写,不过这里介绍另一种方法. 由更相减损之术得,gcd(x, y) ...

The___Flash的博客 299

Can you answer these queries?( HDU - 4027,线段树 + 细节)

一.题目链接: HDU-4027 二.题目大意: n 个数. 有两种操作. 0 X Y:将区间 [X, Y] 的数开方(向下取整) 1 X Y:查询区间 [X, Y] 的和. 三.分析: 直接线段树单点更新会 TLE,由于根号 7 次后向下取整为 1. 所以只需要记录每段区间被更新过的次数. 注意:所给的 X,Y 大小关系不确定因为这里 WA 了三天啊啊啊啊啊啊 555....

The___Flash的博客 288
上一篇: Distance in Tree (CodeForces - 161D,点分治)
下一篇: Fermat's Optimization Problem(UVALive - 8355,2017香港icpc A,java大数 + 枚举 + 二分)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值