2022年浙大城市学院新生程序设计竞赛(同步赛)D. Cutting with Lines Ⅰ(线段分割 离散化+并查集 补写法)

news2024/11/15 17:24:59

题目

二维平面,左下角(0,0)右上角(n,m)(1<=n,m<=1e6)的一块矩形,

q(q<=2e3)次线段切割操作,操作分四种:

ai 1 x,表示切割(x,m)到(x,m-ai)这条竖直线段(0<=x<=n,1<=ai<=1e6)

ai 2 x,表示切割(x,0)到(x,ai)这条竖直线段(0<=x<=n,1<=ai<=1e6)

ai 3 x,表示切割(0,x)到(ai,x)这条竖直线段(0<=x<=m,1<=ai<=1e6)

ai 4 x,表示切割(n-ai,x)到(n,x)这条竖直线段(0<=x<=m,1<=ai<=1e6)

求切割后的最大矩形面积,如图所示,样例最大面积为14

 

思路来源

aging佬代码

题解

离散化,维护up dow lef rig表示四个方向线段的最小、最大、最大、最小的值

上下两个连通块能联通当且仅当左侧的线和右侧的线没有切断这两个连通块

即左侧的线在右侧的点左边,右侧的线在左侧的点右边,左侧的线小于右侧的线

代码1

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10,M=1e6+10;
typedef long long ll;
int n,m,q,x[N],y[N],op,a,b,c,d;
int lef[M],rig[M],up[M],dow[M];
int par[N*N];
ll sz[N*N],ans;
void ckmin(int &x,int y){x=min(x,y);}
void ckmax(int &x,int y){x=max(x,y);}
int find(int x){return par[x]==x?x:par[x]=find(par[x]);}
int f(int x,int y){return x*(d-1)+y;}
void unite(int x,int y){
    x=find(x),y=find(y);
    if(x==y)return;
    par[y]=x;sz[x]+=sz[y];
    ans=max(ans,sz[x]);
}
int main(){
    scanf("%d%d%d",&n,&m,&q);
    fill(rig,rig+m+1,n);
    fill(up,up+n+1,m);
    for(int i=1;i<=q;++i){
        scanf("%d%d%d",&a,&op,&b);
        int mx=(op<=2)?n:m;
        if(b==0 || b==mx)continue;
        if(op==1)ckmin(up[b],m-a);
        else if(op==2)ckmax(dow[b],a);
        else if(op==3)ckmax(lef[b],a);
        else if(op==4)ckmin(rig[b],n-a);
    }
    x[c++]=0;y[d++]=0;
    for(int i=1;i<n;++i)if(dow[i] || up[i]<m)x[c++]=i;
    for(int i=1;i<m;++i)if(lef[i] || rig[i]<n)y[d++]=i;
    x[c++]=n;y[d++]=m;
    for(int i=0;i<c-1;++i){
        for(int j=0;j<d-1;++j){
            int id=f(i,j);
            ll l=x[i+1]-x[i],r=y[j+1]-y[j];
            par[id]=id,sz[id]=l*r;
            ans=max(ans,sz[id]);
        }
    }
    for(int i=0;i<c-1;++i){
        for(int j=0;j<d-1;++j){
            int id=f(i,j),nid,lb;
            if(i+1<c-1){
                lb=x[i+1];
                if(dow[lb]<y[j+1] && up[lb]>y[j] && dow[lb]<up[lb]){
                    nid=f(i+1,j);
                    unite(id,nid);
                }
            }
            if(j+1<d-1){
                lb=y[j+1];
                if(lef[lb]<x[i+1] && rig[lb]>x[i] && lef[lb]<rig[lb]){
                    nid=f(i,j+1);
                    unite(id,nid);
                }
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}

代码2

自己赛中的乱搞,实际是ban掉了相邻块扩展的方向,在扩展的时候合并并查集连通块

#include<bits/stdc++.h>
using namespace std;
const int N=4e3+10;
typedef long long ll;
int n,m,q,x[N],y[N],op,a,b,c,d;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
bool ban[N*N][4];
int par[N*N];
ll sz[N*N],ans;
struct node{
    int a,op,b;
}e[N];
int find(int x){
    return par[x]==x?x:par[x]=find(par[x]);
}
int f(int x,int y){
    return x*(d-1)+y;
}
bool ok(int x,int y){
    return x>=0 && x<c-1 && y>=0 && y<d-1;
}
void unite(int x,int y){
    x=find(x),y=find(y);
    if(x==y)return;
    par[y]=x;sz[x]+=sz[y];
    ans=max(ans,sz[x]);
}
int main(){
    scanf("%d%d%d",&n,&m,&q);
    x[c++]=0;x[c++]=n;
    y[d++]=0;y[d++]=m;
    for(int i=1;i<=q;++i){
        scanf("%d%d%d",&a,&op,&b);
        e[i]={a,op,b};
        if(op==1 || op==2)x[c++]=b;
        else y[d++]=b;
        if(op==1 && m-a>=0)y[d++]=m-a;
        if(op==2 && a<=m)y[d++]=a;
        if(op==3 && a<=n)x[c++]=a;
        if(op==4 && n-a>=0)x[c++]=n-a;
    }
    sort(x,x+c);c=unique(x,x+c)-x;
    sort(y,y+d);d=unique(y,y+d)-y;
    //printf("c:%d d:%d\n",c,d);
    //for(int i=0;i<c;++i)printf("i:%d c:%d\n",i,x[i]);
    //for(int i=0;i<d;++i)printf("i:%d d:%d\n",i,y[i]);
    for(int i=1;i<=q;++i){
        int a=e[i].a,op=e[i].op,b=e[i].b;
        int z,l,r,id1,id2;
        if(op==1){
            z=lower_bound(x,x+c,b)-x;
            l=lower_bound(y,y+d,m-a)-y,r=d-1;//>=min
            if(z && z!=c-1){
                for(int j=l;j<r;++j){
                    id1=f(z-1,j),id2=f(z,j);
                    //printf("op1 id1:(%d,%d) id2:(%d,%d)\n",z-1,j,z,j);
                    ban[id1][0]=ban[id2][2]=1;
                }
            }
        }
        else if(op==2){
            z=lower_bound(x,x+c,b)-x;
            l=0,r=upper_bound(y,y+d,a)-y-1;//<=max
            if(z && z!=c-1){
                for(int j=l;j<r;++j){
                    //printf("op2 id1:(%d,%d) id2:(%d,%d)\n",z-1,j,z,j);
                    id1=f(z-1,j),id2=f(z,j);
                    ban[id1][0]=ban[id2][2]=1;
                }
            }
        }
        else if(op==3){
            z=lower_bound(y,y+d,b)-y;
            l=0,r=upper_bound(x,x+c,a)-x-1;//<=max
            if(z && z!=d-1){
                for(int j=l;j<r;++j){
                    //printf("op3 id1:(%d,%d) id2:(%d,%d)\n",j,z-1,j,z);
                    id1=f(j,z-1),id2=f(j,z);
                    ban[id1][1]=ban[id2][3]=1;
                }
            }
        }
        else{
            z=lower_bound(y,y+d,b)-y;
            l=lower_bound(x,x+c,n-a)-x,r=c-1;//>=min
            if(z && z!=d-1){
                for(int j=l;j<r;++j){
                    //printf("op4 id1:(%d,%d) id2:(%d,%d)\n",j,z-1,j,z);
                    id1=f(j,z-1),id2=f(j,z);
                    ban[id1][1]=ban[id2][3]=1;
                }
            }
        }
    }
    for(int i=0;i<c-1;++i){
        for(int j=0;j<d-1;++j){
            int id=f(i,j);
            ll l=x[i+1]-x[i],r=y[j+1]-y[j];
            //printf("i:%d j:%d l:%lld r:%lld\n",i,j,l,r);
            par[id]=id,sz[id]=l*r;
            ans=max(ans,sz[id]);
        }
    }
    for(int i=0;i<c-1;++i){
        for(int j=0;j<d-1;++j){
            int id=f(i,j);
            //printf("i:%d j:%d sz:%lld\n",i,j,sz[id]);
            for(int k=0;k<4;++k){
                int ni=i+dx[k],nj=j+dy[k];
                if(!ok(ni,nj))continue;
                if(ban[id][k])continue;
                //printf("i:%d j:%d ni:%d nj:%d\n",i,j,ni,nj);
                int nid=f(ni,nj);
                unite(id,nid);
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}

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

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

相关文章

【车载开发系列】UDS诊断---诊断设备在线($0x3E)

【车载开发系列】UDS诊断—诊断设备在线&#xff08;$0x3E&#xff09; 一.概念定义 此服务用于向ECU指示诊断工具在线。当其他UDS服务不存在时&#xff0c;为防止ECU自动转入默认会话模式并停止通信&#xff0c;必须使用此服务。建议以功能寻址的方式发送该指令它唯一的功能…

解决编译 Visual Studio 工程时报 NuGet Package Restore Failed

背景 域渗透的过程中会用到很多 .Net 工具。但是官方仓库没有直接发布的二进制包&#xff0c;那么就需要我们自己手动编译。这些工具又有很多会选择做 NuGet 依赖。如果本地配置不对&#xff0c;就会导致编译失败。 接下来我们就讨论一下怎么解决这个问题。 现象 我们以 AD…

【Vue 快速入门系列】ref、props、mixin、插件使用、样式混合解决方案合集

文章目录前言一、ref属性的使用二、props配置三、mixin混合语法1.简介2.使用方法3.注意点4.结合实例使用①全局混入②局部混入四、插件的使用1.插件语法①定义插件②引入插件并使用2.上手插件五、样式混合问题前言 在前面介绍到了Vue的一些基本概念与如何使用Vue&#xff0c;并…

ARM64(M1版)Mac运行MAA以及AzurLaneAutoScript自动化打明日方舟和碧蓝航线

前言 首先感谢Github上面MAA以及AzurLaneAutoScript的开发组&#xff0c;让我们有工具可用。 再感谢吕明珠LmeSzinc 和binss 大佬&#xff0c;他们的教程让我受益良多。 能看到这篇教程的&#xff0c;想必都拥有M1或者M2芯片的Mac电脑&#xff0c;因为新芯片不能安装双系统所…

RabbitMQ:安装配置

一般来说&#xff0c;安装分为两种方式&#xff1a;1. 下载 RabbitMQ 源文件&#xff0c;解压源文件之后进行安装。2. 通过 brew 命令安装。在这里&#xff0c;推荐使用 brew 来安装&#xff0c;非常强大的 Mac 端包管理工具。 ~ 本篇内容包括&#xff1a;Mac 安装 RabbitMQ、M…

SSM网上在线水果店商城超市网站平台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角…

【数电实验】组合逻辑电路

实验三 触发器及其应用 一 实验目的 1 了解触发器的触发方式&#xff08;上升沿触发、下降沿出发&#xff09;及其触发特点&#xff1b; 2 测试常用触发器的逻辑功能&#xff1b; 3 掌握用触发器设计同步时序逻辑电路的方法。 二 实验内容 1 测试双D触发器74HC74的逻辑功能…

cmu 445 poject 1笔记

文章目录cmu 445 poject 1笔记Extendible hashingLRU-KBufferPool Managercmu 445 poject 1笔记 2022年的任务 https://15445.courses.cs.cmu.edu/fall2022/project1/ extendible hashinglru-kbufferpool manger 本文不写代码&#xff0c;只记录遇到的一些思维盲点 Extendible …

SpringCloud02:微服务架构rest模拟环境搭建

微服务架构rest模拟环境搭建Rest环境搭建&#xff1a;服务提供者springcloud主模块pom.xmlspringcloud-api模块springcloud-provider-dept-8001服务提供模块配置相关Rest环境服务消费者Java编写Rest环境搭建&#xff1a;服务提供者 springcloud主模块pom.xml <?xml versi…

让我们看看xargs做了什么事情?

说到xargs,不得不提到 find 和 grep ,当然了少不了管道 | find 和 grep我经常会搞混掉这两个功能很相似的命令的用法,总是会记不太住怎么用,也借此文章加深一下记忆。 find ./xx/xx/ -name abc.v grep -r abc ./* // -r 表示整个目录查找 一般我们会使用find…

[附源码]计算机毕业设计基于Java酒店管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python Open3D点云配准点对点,点对面ICP(Iterative Closest Point)

Python Open3D点云配准 ICP(Iterative Closest Point&#xff09; 这篇博客将介绍 迭代最近点配准算法(Iterative Closest Point, ICP) 。多年来&#xff0c;它一直是研究和工业中几何注册的支柱。输入是两个点云和一个初始变换&#xff0c;该变换大致将源点云与目标点云对齐。…

g++多文件编译

g windows 多文件编译 文章目录g windows 多文件编译Examplescenario 1scenario 2方法一 使用 先编译&#xff0c;再连接方法二 直接编译 生成结果文件visual code 配置 tasks.json问题 undefined reference to std::__cxx11::basic_string<char, std::charg编译单个文件时&…

Java基础:线程池

第一章 等待唤醒机制 1.1 线程间通信 概念&#xff1a;多个线程在处理同一个资源&#xff0c;但是处理的动作&#xff08;线程的任务&#xff09;却不相同。 比如&#xff1a;线程A用来生成包子的&#xff0c;线程B用来吃包子的&#xff0c;包子可以理解为同一资源&#xff…

【SpringMVC】入门篇:带你了解SpringMVC的执行流程

目录 一、简介 二、环境的搭建 三、快速入门 四、SpringMVC的执行流程 Spring有关的文章已经全部更新完&#xff0c;收录于我的专栏&#x1f449;Spring&#x1f448; 一、简介我们在前边已经学习了Spring的基本使用。从这节开始&#xff0c;我们进行SpringMVC的学习。在学习之…

汇编算数运算指令

目录 加法类指令 加法指令ADD 加进位的加法指令ADC 带进位有啥用呢&#xff1f; 增量指令INC&#xff08;1&#xff09; 减法类指令 减法指令SUB 带借位减法指令SBB 减量指令DEC 比较指令CMP&#xff08;分支程序设计常用&#xff09; 乘法指令 乘法指令MUL和符号整…

职场经验:自动化测试介绍和分类,看这一篇就够了

什么是自动化测试? 自动化测试是软件测试活动中一个重要的分支和组成部分,即利用工具或脚本达到测试目的,没有人工或者极少人工参与的软件测试活动称为自动化测试. 自动化测试的优势有哪些? 方便进行回归测试,当软件的版本发布比较频繁的时候,自动化的效果很明显 自动处理…

全网第三详细tshark使用帮助

一 前言tshark作为wireshark的命令行版本&#xff0c;功能非常强大&#xff0c;可以抓包&#xff0c;数据包分析、提取文件、提取分析后的数据还支持各种格式&#xff0c;可以说一把流量分析的瑞士军刀&#xff0c;如果在低流量的场景&#xff0c;包装下tshark命令&#xff0c;…

查找树莓派ip地址的几种方法

1.环境说明 从上面的图中可以看到树莓派是通过网线和win10电脑相连的&#xff0c;以此来共享win10电脑网络&#xff0c;但是需要在电脑端设置后才能将网络共享出来&#xff0c; 设置方法参考以下链接&#xff1a; 通过一根网线共享网络给另一个电脑或者群辉上网 注意&#xff0…

jQuery 遍历

什么是遍历&#xff1f; jQuery 遍历&#xff0c;意为"移动"&#xff0c;用于根据其相对于其他元素的关系来"查找"&#xff08;或选取&#xff09;HTML 元素。以某项选择开始&#xff0c;并沿着这个选择移动&#xff0c;直到抵达您期望的元素为止。 下图…