Check Corners 【HDU - 2888】【二维线段树】

2023-11-03

题目链接


  很多人写这道题都用的是二维RMQ,但是,我觉得这道题可以锻炼一下我二维线段树的思维,但是,无独有偶,这道题会卡一些二维线段树的模板,一开始我想也没想,直接敲了刚学的线段树,然后不停的RE,后来改了下,换成单点更新与区间更新二维线段树,还是不行TLE了,于是,就开始想,我们该如何把二维线段树双重区间写出来,然后,研究了下他的向下更新操作,我们不妨可以结合一下单点更新作出改进,譬如看向X轴与Y轴,我们先处理X轴的内容,然后对于Y轴,我们在X轴的单位1开始向上延伸,在再Y轴上做区间更新,这样问题就来了,如何判断是否是单位一,单位一时可以直接区间更新,还是easy的,然而不是单位一时,就是长度大于一了,那么我们建外树(X轴的建树)不妨考虑一下先建立完所对应的外树对应节点,然后推上给Y轴相匹配,这里怎么说呢:

    if(l == r)
    {
        if(flag) tree_in[Xi][rt] = a[pos][l];
        else tree_in[Xi][rt] = max(tree_in[Xi<<1][rt], tree_in[Xi<<1|1][rt]);
        return;
    }

  在内树中,我们发现其长度为单位一(flag判断是否单位长度为1),于是就直接赋予其点值,否则就是两个X轴上的区间最大值

  建立外树也是有点东西的,我们不能简单的处理,不然岂不是有些内树的赋值不到位就会WA:

    int mid = (l + r)>>1;
    build_OutTree(rt<<1, l, mid);
    build_OutTree(rt<<1|1, mid+1, r);
    build_InTree(1, rt, 1, M, false, l);

  我们先处理外树,然后再看向内树,毕竟内树的叶子节点是需要外树的赋值的,所以就是有序内外树的。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 305;
int N, M, Q;
ll a[maxN][maxN], tree_in[maxN<<2][maxN<<2];
void build_InTree(int rt, int Xi, int l, int r, bool flag, int pos)
{
    if(l == r)
    {
        if(flag) tree_in[Xi][rt] = a[pos][l];
        else tree_in[Xi][rt] = max(tree_in[Xi<<1][rt], tree_in[Xi<<1|1][rt]);
        return;
    }
    int mid = (l + r)>>1;
    build_InTree(rt<<1, Xi, l, mid, flag, pos);
    build_InTree(rt<<1|1, Xi, mid+1, r, flag, pos);
    tree_in[Xi][rt] = max(tree_in[Xi][rt<<1], tree_in[Xi][rt<<1|1]);
}
void build_OutTree(int rt, int l, int r)
{
    if(l == r)
    {
        build_InTree(1, rt, 1, M, true, l);
        return;
    }
    int mid = (l + r)>>1;
    build_OutTree(rt<<1, l, mid);
    build_OutTree(rt<<1|1, mid+1, r);
    build_InTree(1, rt, 1, M, false, l);
}
ll query_in(int rt, int Xi, int l, int r, int ql, int qr)
{
    if(ql<=l && qr>=r) return tree_in[Xi][rt];
    int mid = (l + r)>>1;
    if(ql>mid) return query_in(rt<<1|1, Xi, mid+1, r, ql, qr);
    else if(qr<=mid) return query_in(rt<<1, Xi, l, mid, ql, qr);
    else
    {
        ll ans = query_in(rt<<1|1, Xi, mid+1, r, ql, qr);
        ans = max(ans, query_in(rt<<1, Xi, l, mid, ql, qr));
        return ans;
    }
}
ll query_out(int rt, int l, int r, int qlx, int qly, int qrx, int qry)
{
    if(qlx<=l && qrx>=r) return query_in(1, rt, 1, M, qly, qry);
    int mid = (l + r)>>1;
    if(qlx>mid) return query_out(rt<<1|1, mid+1, r, qlx, qly, qrx, qry);
    else if(qrx<=mid) return query_out(rt<<1, l, mid, qlx, qly, qrx, qry);
    else
    {
        ll ans = query_out(rt<<1|1, mid+1, r, qlx, qly, qrx, qry);
        ans = max(ans, query_out(rt<<1, l, mid, qlx, qly, qrx, qry));
        return ans;
    }
}
int main()
{
    while(scanf("%d%d", &N, &M)!=EOF)
    {
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=M; j++)
            {
                scanf("%lld", &a[i][j]);
            }
        }
        build_OutTree(1, 1, N);
        scanf("%d", &Q);
        while(Q--)
        {
            int e1, e2, e3, e4;
            scanf("%d%d%d%d", &e1, &e2, &e3, &e4);
            bool flag = false;
            ll tmp = query_out(1, 1, N, e1, e2, e3, e4);
            if(a[e1][e2] == tmp || a[e1][e4] == tmp || a[e3][e2] == tmp || a[e3][e4] == tmp) flag = true;
            printf("%lld ", tmp);
            printf(flag?"yes\n":"no\n");
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Check Corners 【HDU - 2888】【二维线段树】 的相关文章

随机推荐

  • 机器学习——朴素贝叶斯、后验概率最大和极大似然

    朴素贝叶斯没有参数估计 给堆数据直接求 属于生成模型 不用优化模型求最佳参数 这区别于判别模型 我遇到的困惑 1 后验概率最大 和 极大似然 这二者有什么区别和联系吗 2 朴素贝叶斯和EM这二者有什么区别和联系吗 答案 1 朴素贝叶斯是根据
  • 怎么维护自己的电脑?

    方向一 我的电脑介绍 我使用的是一台来自知名品牌的笔记本电脑 它具有高性能的核心配置 如快速处理器 大容量内存和高性能显卡 以及宽敞的存储空间 我选择这台电脑主要是因为它的出色性能和可靠性 能够满足我在学习和工作中的需求 方向二 我的日常维
  • 数据分析Power BI数据建模教程(四)——如何创建计算度量值和计算表

    Power BI 是基于云的商业数据分析和共享工具 它能帮您把复杂的数据转化成最简洁的视图 通过它 您可以快速创建丰富的可视化交互式报告 即使在外也能用手机端 APP 随时查看 甚至检测公司各项业务的运行状况 只需它仪表板的一个界面就够了
  • 使用yum安装nginx,几步完成,超级简单!(亲测)

    1 安装yum utils工具包 sudo yum install yum utils 2 设置yum存储库 进入 etc yum repos d目录 cd etc yum repos d 创建nginx repo文件 vim nginx
  • AMIS + httplib 快速搭建前后端

    AMIS httplib 快速搭建前后端 1 简介 1 1 AMIS简介 1 2 httplib开源库 2 快速使用 2 1 AMIS环境搭建 2 2 创建一个登陆页面 2 3 利用httplib搭建简单的后端 2 4 运行 尾声总结 1
  • 基于python手动画出spectrogram(语谱图)

    Spectrogram是基于STFT变换得到的 非常有助于分析信号的时频特性 在语音信号处理中常被称为 语谱图 python中有一些写好的模块可以直接将时域的信号转化成spectrogram 但这并不利于对其原理的理解 而且横纵左边的转换也
  • Vue中token刷新及续期的功能实现

    在vue中如何实现token续期 刷新token 原因 最近公司项目有一个视频播放的功能 然后由于在测试环境登录时token过期时间较短导致一直在当前页面播放视频会出现token过期的现象 然后用户刷新会触发axios响应拦截器的操作退出系
  • Day01.二分查找、移除元素

    Day01 二分查找 移除元素 0704 二分查找 题目链接 0704 二分查找 思路 二分查找 仅对有序数组有效 每次需要数组的中间值 与目标值比较大小 如果中间值比目标值大 说明目标值位置在left与mid中间 区间缩小一半 同理 如果
  • 蓝桥杯试题联系

    题目 你有一架天平 现在你要设计一套砝码 使得利用这些砝码可以称出任意 小于等于 N 的正整数重量 那么这套砝码最少需要包含多少个砝码 注意砝码可以放在天平两边 输入格式 输入包含一个正整数 N 输出格式 输出一个整数代表答案 样例输入 7
  • 2D离散傅里叶变换及逆变换的matlab实现

    积分线性变换可以将信号或图像在更适合的域内表达 并且使得解决相关问题更容易 在图像分析中最常用的积分显示变换是傅里叶变换 离散余弦变换与小波变换 1d傅里叶变换由傅里叶 Fourier 提出 1d傅里叶变换将函数f x 变换到频率域F t
  • android 屏幕适配框架,Android屏幕适配

    为什么要进行Android屏幕适配 由于Android系统的开放性 任何用户 开发者 OEM厂商 运营商都可以对Android进行定制 于是导致 1 Android系统碎片化 小米定制的MIUI 魅族定制的flyme 华为定制的EMUI等等
  • 组合式 API - 生命周期钩子

    选项式 API Hook inside setup beforeCreate Not needed gt setup created Not needed gt setup beforeMount onBeforeMount mounted
  • 适配器设计模式

    目录 前言 适配器原理与实现 适配器模式的应用场景 1 封装有缺陷的接口 2 统一多个类的接口设计 3 替换依赖的外部系统 4 兼容老版本接口 5 适配不同格式的数据 代理 桥接 装饰器 适配器 4 种设计模式的区别 参考资料 前言 适配器
  • 【C++】拷贝构造函数(深拷贝,浅拷贝)详解

    一 什么是拷贝构造函数 首先对于普通类型的对象来说 它们之间的复制是很简单的 例如 int a 100 int b a 而类对象与普通对象不同 类对象内部结构一般较为复杂 存在各种成员变量 下面看一个类对象拷贝的简单例子 1 include
  • TypeScript从入门到放弃(一)

    先点赞后关注 防止会迷路 寄语 长风破浪会有时 直挂云帆济沧海 本文已收录至https github com likekk Blog欢迎大家star 共同学习 共同进步 如果文章有错误的地方 欢迎大家指出 后期将在将github上规划前端学
  • linux上的常用的一些操作

    Ubuntu 上安装程序 rpm 命令 https www cnblogs com ftl1012 p rpm html 查看硬盘分区和使用情况 df h 转载于 https www cnblogs com zach0812 p 11507
  • 拒绝拷贝,研读官方文档-小话Mysql锁

    实践出真知 跟着官方文档跑Demo 参考文档 由于中文站是机译 阅读拗口 更推荐阅读英文文档 Mysql官网文档 英文站 Mysql官网文档 中文站 范围 行锁 表锁 独占锁S 排他锁X 意向排他IX 意向独占IS 现状吐槽 自我理解 一针
  • 成员初始化列表-适用场合

    1 简述 主要的场合有四类 初始化对象成员 初始化基类的成员 初始化const成员 初始化引用成员 对于const成员和引用成员 比较简单 这两种变量都要求初始化后不能赋值 因此 只能在成员初始化列表中进行初始化 其他地方不行 本文主要介绍
  • MATLAB 气体扩散,放射性气体扩散方程有限差分法的MATLAB实现

    2017年11月 咸阳师范学院学报 Nov 2017 第32卷 第6期 Journal of Xianyang Normal University Vol 32 No 6 数理科学与信息科学研究 放射性气体扩散方程有限差分法的MATLAB实
  • Check Corners 【HDU - 2888】【二维线段树】

    题目链接 很多人写这道题都用的是二维RMQ 但是 我觉得这道题可以锻炼一下我二维线段树的思维 但是 无独有偶 这道题会卡一些二维线段树的模板 一开始我想也没想 直接敲了刚学的线段树 然后不停的RE 后来改了下 换成单点更新与区间更新二维线段