当前位置: 首页 > news >正文

CF2074F Counting Necessary Nodes

CF2074F Counting Necessary Nodes

题目描述

四叉树是一种树形数据结构,其中每个节点最多有四个子节点,每个节点对应一个正方形区域。

形式化地说,对于所有非负整数 k , a , b ≥ 0 k, a, b \ge 0 k,a,b0 的元组,存在且仅存在一个节点对应以下区域 ∗ ^{\text{∗}}

[ a ⋅ 2 k , ( a + 1 ) ⋅ 2 k ] × [ b ⋅ 2 k , ( b + 1 ) ⋅ 2 k ] [a \cdot 2^k, (a+1) \cdot 2^k] \times [b \cdot 2^k, (b+1) \cdot 2^k] [a2k,(a+1)2k]×[b2k,(b+1)2k]

所有区域大小超过 1 × 1 1 \times 1 1×1 的节点都包含四个子节点,这些子节点对应将原区域四等分后的四个子区域;而区域为 1 × 1 1 \times 1 1×1 的节点对应树的叶节点。

图中展示了部分节点对应的区域。颜色较深的区域更接近叶节点。

Frontman 厌恶一个普遍的误解——当区域内包含 n n n 个叶节点时,四叉树可以在 O ( log ⁡ n ) \mathcal{O}(\log n) O(logn) 时间内完成范围查询。事实上,有时需要查询远多于 O ( log ⁡ n ) \mathcal{O}(\log n) O(logn) 个区域,极端情况下时间复杂度甚至为 O ( n ) \mathcal{O}(n) O(n)。因此,Frontman 设计了此题来教育你关于该数据结构的最坏情况。

粉色士兵们给定了一个有限区域 [ l 1 , r 1 ] × [ l 2 , r 2 ] [l_1, r_1] \times [l_2, r_2] [l1,r1]×[l2,r2],其中 l i l_i li r i r_i ri l i < r i l_i < r_i li<ri)为非负整数。请找出最少需要选择多少个节点,使得这些节点对应区域的并集恰好等于给定区域。这里,两个点集被认为是不同的,当且仅当存在一个点属于其中一个集合但不属于另一个。

∗ ^{\text{∗}} 区域是具有实数坐标的点集。点 ( x , y ) (x, y) (x,y) 属于区域 [ p , q ] × [ r , s ] [p, q] \times [r, s] [p,q]×[r,s] 当且仅当 p ≤ x ≤ q p \le x \le q pxq r ≤ y ≤ s r \le y \le s rys。此处 × \times × 形式上指集合的笛卡尔积。

输入格式

每个测试包含多个测试用例。第一行包含测试用例的数量 t t t 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1t104)。接下来是每个测试用例的描述。

每个测试用例的唯一一行包含四个整数 l 1 l_1 l1 r 1 r_1 r1 l 2 l_2 l2 r 2 r_2 r2 —— 各坐标轴的区域边界( 0 ≤ l i < r i ≤ 1 0 6 0 \le l_i < r_i \le 10^6 0li<ri106)。

输出格式

对于每个测试用例,在单独一行中输出满足条件所需的最少节点数量。

输入输出样例 #1

输入 #1

5
0 1 1 2
0 2 0 2
1 3 1 3
0 2 1 5
9 98 244 353

输出 #1

1
1
4
5
374

说明/提示

第一个测试用例中,给定区域为 [ 0 , 1 ] × [ 1 , 2 ] [0, 1] \times [1, 2] [0,1]×[1,2]。存在一个节点对应该区域,选择该节点即可,答案为 1 1 1

第二个测试用例中,给定区域为 [ 0 , 2 ] × [ 0 , 2 ] [0, 2] \times [0, 2] [0,2]×[0,2]。存在一个节点对应该区域,选择该节点即可,答案为 1 1 1

第三个测试用例中,给定区域为 [ 1 , 3 ] × [ 1 , 3 ] [1, 3] \times [1, 3] [1,3]×[1,3]。不存在对应该区域的节点。但可以通过选择以下 4 4 4 个叶节点构造出相同区域:

  • 对应 [ 1 , 2 ] × [ 1 , 2 ] [1, 2] \times [1, 2] [1,2]×[1,2] 的叶节点;
  • 对应 [ 1 , 2 ] × [ 2 , 3 ] [1, 2] \times [2, 3] [1,2]×[2,3] 的叶节点;
  • 对应 [ 2 , 3 ] × [ 1 , 2 ] [2, 3] \times [1, 2] [2,3]×[1,2] 的叶节点;
  • 对应 [ 2 , 3 ] × [ 2 , 3 ] [2, 3] \times [2, 3] [2,3]×[2,3] 的叶节点。

可以证明无法用少于 4 4 4 个节点构造出该区域,因此答案为 4 4 4

第四个测试用例中,给定区域为 [ 0 , 2 ] × [ 1 , 5 ] [0, 2] \times [1, 5] [0,2]×[1,5]。可以通过选择以下 5 5 5 个节点构造出相同区域:

  • 对应 [ 0 , 1 ] × [ 1 , 2 ] [0, 1] \times [1, 2] [0,1]×[1,2] 的叶节点;
  • 对应 [ 1 , 2 ] × [ 1 , 2 ] [1, 2] \times [1, 2] [1,2]×[1,2] 的叶节点;
  • 对应 [ 0 , 2 ] × [ 2 , 4 ] [0, 2] \times [2, 4] [0,2]×[2,4] 的非叶节点;
  • 对应 [ 0 , 1 ] × [ 4 , 5 ] [0, 1] \times [4, 5] [0,1]×[4,5] 的叶节点;
  • 对应 [ 1 , 2 ] × [ 4 , 5 ] [1, 2] \times [4, 5] [1,2]×[4,5] 的叶节点。

可以证明无法用少于 5 5 5 个节点构造出该区域,因此答案为 5 5 5

翻译由 DeepSeek R1 完成

#include <bits/stdc++.h>

using i64 = long long;

void solve () {
    i64 l1, r1, l2, r2;
    std::cin >> l1 >> r1 >> l2 >> r2;
    i64 cnt = (r1 - l1) * (r2 - l2);
    for (int i = 1; i <= 20; ++i) {
        i64 t = 1 << i;
        i64 lx = (l1 >> i << i);
        if (l1 % t != 0) lx += t;
        i64 ly = (l2 >> i << i);
        if (l2 % t != 0) ly += t;
        i64 rx = r1 >> i << i;
        i64 ry = r2 >> i << i;
        if (lx >= rx || ly >= ry) break;
        cnt -= 3 * (rx - lx) / t * (ry - ly) / t;
    }
    std::cout << cnt << std::endl;
}

int main() {
#ifdef qmwneb
    assert(freopen(".in.txt", "r", stdin));
    assert(freopen(".out.txt", "w", stdout));
#endif
    std::cin.tie(0)->std::ios::sync_with_stdio(0);
    int t = 1;
    std::cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/115696.html

相关文章:

  • 电动垂直起降飞行器(eVTOL)
  • 每天五分钟深度学习框架pytorch:搭建LSTM完成时间序列的预测
  • 汉明码:从奇偶校验到错误精确定位的传奇编码
  • 【11408学习记录】英语通知写作速成攻略:框架拆解+宾语从句疑难全破解
  • 21 天 Python 计划:MySQL 库相关操作
  • DB-Mysql中TIMESTAMP与DATETIME的区别
  • 【Flask开发】嘿马文学web完整flask项目第3篇:2.用户认证,2.用户认证【附代码文档】
  • 【STM32单片机】#6 定时器比较输出
  • OceanSim: 基于Isaac Sim GPU 加速水下机器人感知仿真框架
  • 基于SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)
  • qt socket编程正确重启tcpServer的姿势
  • 同一份数据,Redis为什么要存两次
  • 人脸考勤管理一体化系统(人脸识别系统,签到打卡)
  • WinForm真入门(9)——RichTextBox控件详解
  • 基于大数据的美团外卖数据可视化分析系统
  • 【易飞】易飞批量选择品号处理方法,工作效率提升300%
  • 学透Spring Boot — 018. 优雅支持多种响应格式
  • 多智能体优秀开发框架
  • Java 中的 CompletableFuture:异步编程的强大工具
  • 网络原理 - HTTP/HTTPS
  • HAL 库设置回调成员函数的一种方法
  • 2-vim编辑器的安装和使用
  • 【爬虫】携程旅游项目数据爬取
  • GPT-4o从语义分割到深度图生成,大模型狂潮下的计算机视觉:技术进步≠替代危机
  • C#UDP协议客户端工具类
  • C#实现存储数据到Redis
  • 运行小程序报错
  • Leetcode 3508. Implement Router
  • Java数据结构的基础用法
  • 嵌入式AI开源生态指南:从框架到应用的全面解析