Denso Create Programming Contest 2023 (AtCoder Beginner Contest 309) F题解

news2024/9/9 5:27:34

文章目录

  • [Box in Box](https://atcoder.jp/contests/abc309/tasks/abc309_f)
    • 问题建模
    • 问题分析
      • 1.分析操作
      • 2.如何比较长方体判断是否有满足条件的长方体存在
      • 3.方法1使用树状数组来维护1~对应二维属性值区间内的最小三维属性值
        • 代码
      • 4.方法2使用线段树来维护1~对应二维属性值区间内的最小三维属性值
        • 代码

Box in Box

在这里插入图片描述

问题建模

给定n个长方体,可以任意旋转长方体,问是否存在两个长方体其中一个长方体的长宽高都大于另一个长方体

问题分析

1.分析操作

任意旋转一个长方体,也就是将其长宽高进行交换,若所给n个长方体中存在满足要求的两个长方体,则在通过选择使其长宽高升序后,同样满足条件,则可以先对所有长方体的长宽高都排为升序。

2.如何比较长方体判断是否有满足条件的长方体存在

由于要判断两个长方体之间是否满足要求,要比较长宽高三个属性值,则可以先将所有元素按第一维的属性值大小来排序,这样就省去一维属性值的判断。然后从小到大,在考虑剩余两维属性的情况下进行判断。我们可以考虑维护一个已经遍历过元素的1~对应第二维属性值区间内的最小第三维属性值来帮助判断。

3.方法1使用树状数组来维护1~对应二维属性值区间内的最小三维属性值

代码

#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =2e5+10, INF=0x3f3f3f3f;
struct Node{
    int a,b,c;
};
Node nodes[N];
bool cmp(Node &n1,Node &n2){
    return n1.a<n2.a;
}
int tr[N];
int cnt;
int lowbit(int x){
    return x&-x;
}

int query(int x){
    int res=INF;
    for(int i=x;i;i-=lowbit(i)){
        res=min(tr[i],res);
    }
    return res;
}

void update(int k,int x){
    for(int i=k;i<=cnt;i+=lowbit(i)){
        tr[i]=min(tr[i],x);
    }
}

void solve() {
    int n;
    cin >>n;
    cnt=0;
    set<int> st;///去重
    unordered_map<int,int> mp;
    for(int i=1;i<=n;i++){
        int a[3];
        scanf("%d %d %d",&a[0],&a[1],&a[2]);
        sort(a,a+3);
        nodes[i]={a[0],a[1],a[2]};
        st.insert(a[1]);
    }
    ///使一维属性值有序
    sort(nodes+1,nodes+1+n,cmp);
    for(auto v:st){//离散化二维属性值
        mp[v]=++cnt;
    }
    memset(tr,INF,sizeof(tr));

    for(int i=1;i<=n;i++){
        int l=i;
        ///对于一维属性值相同的元素要一块查询
        while(l<n&&nodes[l+1].a==nodes[l].a)    l++;

        for(int j=i;j<=l;j++){
            if(query(mp[nodes[j].b]-1)<nodes[j].c){
                puts("Yes");
                return ;
            }
        }

        for(int j=i;j<=l;j++){
            update(mp[nodes[j].b],nodes[j].c);
        }
        i=l;
    }
    puts("No");
}   


int main() {
    int t = 1;
    //cin >> t;
    while (t--) solve();
    return 0;
}

4.方法2使用线段树来维护1~对应二维属性值区间内的最小三维属性值

代码

#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =2e5+10, INF=0x3f3f3f3f;
struct Node{
    int a,b,c;
};
Node nodes[N];
bool cmp(Node &n1,Node &n2){
    return n1.a<n2.a;
}
int cnt;

struct Seg{
    int l,r;
    int val;
}tr[N*4];

void pushup(int u){
    tr[u].val=min(tr[u<<1].val,tr[u<<1|1].val);
}

void build(int u,int l,int r){
    if(l==r)    tr[u]={l,r,INF};
    else {
        tr[u]={l,r};
        int mid=(l+r)>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}

void modify(int u,int x,int d){
    if(tr[u].l==x&&tr[u].r==x)  tr[u].val=min(tr[u].val,d);
    else {
        int mid=tr[u].l+tr[u].r>>1;
        if(x<=mid)  modify(u<<1,x,d);
        else modify(u<<1|1,x,d);
        pushup(u);
    }
}


int query(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r)  return tr[u].val;

    int mid=tr[u].l+tr[u].r>>1;
    int res=INF;
    if(l<=mid)  res=query(u<<1,l,r);
    if(r>mid)   res=min(res,query(u<<1|1,l,r));
    return res;
}

void solve() {
    int n;
    cin >>n;
    cnt=0;
    set<int> st;
    unordered_map<int,int> mp;
    for(int i=1;i<=n;i++){ 
        int a[3];
        scanf("%d %d %d",&a[0],&a[1],&a[2]);
        sort(a,a+3);
        nodes[i]={a[0],a[1],a[2]};
        st.insert(a[1]);
    }
    sort(nodes+1,nodes+1+n,cmp);
    for(auto v:st){
        mp[v]=++cnt;
    }
    build(1,1,cnt);

    for(int i=1;i<=n;i++){
        int l=i;
        while(l<n&&nodes[l+1].a==nodes[l].a)    l++;

        for(int j=i;j<=l;j++){
            if(query(1,1,mp[nodes[j].b]-1)<nodes[j].c){
                puts("Yes");
                return ;
            }
        }

        for(int j=i;j<=l;j++){
            modify(1,mp[nodes[j].b],nodes[j].c);
        }
        i=l;
    }
    puts("No");
}   


int main() {
    int t = 1;
    //cin >> t;
    while (t--) solve();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

四、写作&#xff1a;第56~57小题&#xff0c;共65分。其中论证有效性分析30分&#xff0c;论说文35分。请答在答题纸相应的位置上。 56.论证有效性分析&#xff1a;分析下述论证中存在的缺陷与漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该…

基于Java+SpringBoot+Vue前后端分离电商项目

晚间lucky为友友们送福利啦~&#x1f381; Tips&#xff1a;有需要毕业设计指导的童鞋一定要认真看哦&#xff0c;文末有彩蛋。 一.项目介绍 该电商项目是一个简单、入门级的电商项目&#xff0c;是基于JavaSpringBootVue前后端分离项目。前端采用两套独立的系统分别完成项目…

驱动开发(中断)

头文件&#xff1a; #ifndef __LED_H__ #define __LED_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_LED1_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014 #define PHY_LED2_RCC 0X50000A28#def…

java学习路程之篇六、进阶知识、常用API、Arrays工具类、冒泡排序、选择排序、二分查找、正则表达式

文章目录 1、Arrays工具类2、冒泡排序3、选择排序4、二分查找5、正则表达式 1、Arrays工具类 2、冒泡排序 3、选择排序 4、二分查找 5、正则表达式

抖音引流推广的几个方法,抖音全自动引流脚本软件详细使用教学

大家好我是你们的小编一辞脚本&#xff0c;今天给大家分享新的知识&#xff0c;很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码&#xff0c;给大家分享一下抖音引流脚本的知识和视频演示 不懂的小伙伴可以认真看一下&#xff0c;我们…

快速搭建Vue项目

1.安装node环境 下载地址为&#xff1a;https://nodejs.org/en/ 注意node版本问题&#xff0c;有很多情况下是node版本问题导致的错误。 2.安装淘宝镜像cnpm 为了提高我们的效率&#xff0c;可以使用淘宝的镜像&#xff1a;http://npm.taobao.org/ npm install cnpm -g --r…

【Redis】内存数据库Redis进阶(搭建各种集群)

目录 单机安装Redis搭建Redis主从集群搭建Redis哨兵集群 基于 CentOS 7 的 Redis 集群 单机安装Redis 安装 Redis 所需要的依赖&#xff1a; yum install -y gcc tcl将 Redis 安装包&#xff08;redis-6.2.4.tar.gz&#xff09;上传到任意目录 解压缩&#xff1a; tar -xzf …

如何过一个高质量的周末?

如何过一个高质量的周末&#xff1f; &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1…

分布式系统常见理论讲解

分布式系统是指由多个节点通过网络进行通信和协作的系统&#xff0c;它具有高可用性、高扩展性、高性能等优点&#xff0c;但也面临着一些挑战&#xff0c;如数据一致性、容错性、负载均衡等。为了解决这些问题&#xff0c;分布式系统设计出现了一些经典的理论和方法&#xff0…

阻塞队列BlockingQueue详解

一、阻塞队列介绍 1、队列 队列入队从队首开始添加&#xff0c;直至队尾&#xff1b;出队从队首出队&#xff0c;直至队尾&#xff0c;所以入队和出队的顺序是一样的 Queue接口 add(E) &#xff1a;在指定队列容量条件下添加元素&#xff0c;若成功返回true&#xff0c;若当前…

【C++奇遇记】初探名称空间

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

Ubuntu篇——Ubuntu20.04备份成ISO镜像文件并安装到其他电脑上(完整步骤)

注意&#xff0c;此方法制作的镜像&#xff0c;仅限于相同硬件配置的电脑安装&#xff0c;否则可能会发生某些驱动不兼容导致无法安装的情况。&#xff08;例如英伟达显卡的笔记本电脑&#xff0c;很大概率无法安装你在其他显卡电脑上制作的镜像。&#xff09; 一、安装systemb…

设计模式行为型——命令模式

目录 什么是命令模式 命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项 什么是命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式&#xff0c;它属…

一篇关于CPU的硬核知识

不管你玩硬件还是做软件&#xff0c;你的世界都少不了计算机最核心的 —— CPU。 01CPU是什么&#xff1f; CPU与计算机的关系就相当于大脑和人的关系&#xff0c;它是一种小型的计算机芯片&#xff0c;通常嵌入在电脑的主板上。CPU的构建是通过在单个计算机芯片上放置数十亿…

iOS开发-UIScrollView嵌套tableView实现顶部tab横向切换

iOS开发-UIScrollView嵌套tableView实现顶部tab横向切换 通过ScollView嵌套两个TableView左右切换功能 一、UIScollView UIScrollView可滚动控件&#xff0c;这里初始化需要设置_backScollView.pagingEnabled YES; 代码如下 _backScollView [[UIScrollView alloc] initWi…

ARP协议请求

文章目录 作用请求与应答流程数据包ARP协议以太网帧协议具体应用 作用 通过 IP地址 查找 MAC地址。 请求与应答流程 A&#xff1a;数据发送主机 B&#xff1a;目标主机 目前只知道目标主机IP地址&#xff0c;想把数据发送过去&#xff0c;需要查询到目标主机的MAC地址&#x…

构建基于大模型的Autonomous Agents案例(一)

构建基于大模型的Autonomous Agents案例 1.1 Autonomous Agents原理机制 在本节中&#xff0c;我们将聚焦于LangChain上的自治代理&#xff08;Autonomous Agents on LangChain&#xff09;。自治代理是当前业界最热门的话题之一&#xff0c;特别是在企业级应用中。当然&#x…

关于综合能源智慧管理系统的架构及模式规划的研究

安科瑞 华楠 摘 要&#xff1a;探讨了国内外能源互联网的研究发展&#xff0c;分析了有关综合智慧能源管理系统的定位&#xff0c;以及系统的主要特点&#xff0c;研究了综合智慧能源管理系统的构架以及模式规划。 关键词&#xff1a;综合能源&#xff1b;智慧管理系统&#…

MySql操作进阶

目录 1.多表联查 1.1内连接 1.2左连接和右连接 1.3自连接 2.子查询 3.合并查询 1.多表联查 多表联查实际上就是对多张表中的数据合并在一起进行查询&#xff0c;具体合并多张表中的数据方式为&#xff1a;取笛卡尔积的方式进行合并。 但仅是以笛卡尔积的方式合并表较为…

网络安全进阶学习第九课——SQL注入介绍

文章目录 一、什么是注入二、什么是SQL注入三、SQL注入产生的原因四、SQL注入的危害五、SQL注入在渗透中的利用1、绕过登录验证&#xff1a;使用万能密码登录网站后台等。2、获取敏感数据3、文件系统操作4、注册表操作5、执行系统命令 六、如何挖掘SQL注入1、SQL注入漏洞分类按…