2023NOIP A层联测19-多边形

news2024/9/28 15:28:53

有一个正 n n n 边形,每个点的颜色为红色,蓝色,绿色中的其中一种。保证每种颜色至少出现一次且 n n n 边形上相邻的两个点颜色不同。你想要连接 n − 3 n−3 n3 条对角线,使得对角线把整个图形分成了 n − 2 n−2 n2 个三角形(即三角剖分),并且每个三角形三个顶点颜色两两不同。任意输出一种方案即可,如果无解输出 Impossible!

n ≤ 1 0 6 n\le10^6 n106


如果某种颜色在 n n n 个点中只出现一次,那么所有三角形都有这个颜色所在的点,所以只能把这个点连向所有其他点,判断是否可行。

考虑 n 2 n^2 n2 的暴力。枚举 j , k j,k j,k,那么由三个点 1 , j , k 1,j,k 1,j,k 构成的三角形把多边形分成了外面的三份(下面的三角形顶点颜色都符合条件)。看下图,点 1 , 4 , 9 1,4,9 1,4,9 所构成的三角形把这个十边形分成红色 1 , 2 , 3 1,2,3 1,2,3 三份
在这里插入图片描述

然后考虑每一份的情况,设有边相连的点为 l , r l,r l,r,在一个块中枚举 x x x,由三个点 l , r , x l,r,x l,r,x 构成的三角形把这个块分成两份。图中点 4 , 6 , 9 4,6,9 4,6,9 构成的三角形把块分成蓝色 1 , 2 1,2 1,2 两部分,发现这里分下去形式相同,所以这里可以递归下去,再加一个记忆化, f i , j f_{i,j} fi,j 表示从点 i i i j j j 的块是否能三角剖分,这样的时间复杂度是 O ( n 2 ) O(n^2) O(n2) 的。

由于这样分下去最终一定会无法再分,说明若有解,在多边形上必有连续三个顶点颜色互不相同(它们构成的三角形是无法再分的)。这时把中间的点删去(因为这个点后面不会再用到),这样变成了 n − 1 n-1 n1 边形,这样就可以递归考虑下去,不停的删点,如果点数大于三但是不能再删下去就是无解。这样操作的前提是任意颜色数量都大于 1 1 1,因为如果把只剩一种颜色的点删去了,本来可能有解,被你搞成无解了。
这时候还有一个问题,有没有可能找到了三个连续定点,删去中间这个就不行了,而选其他的三个删中间的就行了?其实不会,如果删去的点的颜色数量只剩两个,假设这两个点“删去”了,那么现在相邻两个点颜色要互异,否则无解,跟删哪个点没有关系;如果有删去的点的颜色数量有很多,由归纳法得知任意删去一个即可。

实现上可以用链表来维护点。时间复杂度 O ( n ) O(n) O(n)

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1;
int n,bj[N],num[3];
char s[N];
int head,nxt[N],pre[N],col[N],cnt,sz;
vector<pair<int,int> > ans;
void dfs(int now)
{
    if(sz==3||bj[now]) return;
    if(num[0]==1||num[1]==1||num[2]==1){
        int now=head;
        for(int i=1;i<=sz;i++){
            if(num[col[now]]==1) break;
            now=nxt[now];
        }
        int i=nxt[now];
        for(;nxt[i]!=now;i=nxt[i]){
            if((col[now]^col[i]^col[nxt[i]])!=3) cout<<"Impossible!",exit(0);
            if(i!=nxt[now]) ans.push_back(make_pair(now,i));
        }
        for(auto i:ans) cout<<i.first<<" "<<i.second<<"\n";
        exit(0);
    }
    if(col[pre[now]]^col[nxt[now]]^col[now]==3){
        ans.push_back(make_pair(pre[now],nxt[now]));
        bj[now]=1;
        num[col[now]]--;
        nxt[pre[now]]=nxt[now];
        pre[nxt[now]]=pre[now];
        head=nxt[now];
        sz--;
        dfs(pre[now]);
        dfs(nxt[now]);
    }
}
int main()
{
    freopen("polygon.in","r",stdin);
    freopen("polygon.out","w",stdout);
    cin.tie(0)->sync_with_stdio(0);
    cin>>n>>(s+1);
    head=1;
    for(int i=1;i<=n;i++){
        num[s[i]=='R'?0:s[i]=='G'?1:2]++;
        col[++cnt]=(s[i]=='R'?0:s[i]=='G'?1:2);
        pre[cnt]=cnt-1;
        nxt[cnt-1]=cnt;
    }
    nxt[cnt]=1;
    pre[1]=cnt;
    if(!num[0]||!num[1]||!num[2]) goto a;
    sz=n;
    for(int i=1;i<=n;i++) dfs(i);
    a:cout<<"Impossible!";
}

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

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

相关文章

竞赛选题 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

kali搭建docker

kali搭建docker 更新kali源 sudo apt update出错 更新一下密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ED444FF07D8D0BF6安装docker sudo apt install docker.io -y #安装docker docker -v #docker版本 sudo systemctl status docker #查看docker…

手把手教你安装配置『Oracle Database 19c』

前言 本文将会讲解如何在 Windows 系统上安装 Oracle Database 19c 数据库&#xff0c;适合初学者学习 Oracle 快速入门和实践练习&#xff0c;比较方便快捷 官方安装文档&#xff1a;Preinstallation Considerations for Installing Oracle Database 对于企业级的数据库&am…

问界新M7也扛起“遥遥领先”大旗,华为究竟做对了什么?

循着时间脉络&#xff0c;华为似乎正在实现全方面的“遥遥领先”。 继Mate 60系列手机产品的强势回归之后&#xff0c;华为参与的汽车项目也登上了“热搜榜”。近段时间&#xff0c;问界新M7正处于“卖爆”状态。 据了解&#xff0c;2023年9月12日&#xff0c;华为发布了问界…

Linux 基本语句_7_C语言_文件I/O文件复制操作

标准I/O与文件I/O的区别&#xff1a; 标准I/O每次调用函数写入字符&#xff0c;并不是直接将字符写入文件&#xff0c;而是先写入缓冲区 文件I/O则是每次调用函数写入都会产生一次系统调用&#xff0c;Liunx必须从用户态切换至内核态&#xff0c;但过度频繁得执行系统调用会增…

Btrace入门

一、前言 今天收到客户报的一个Bug,登录系统查看发现没有相关日志输出&#xff0c;方法中相关的请求参数及变量都没有打印出来&#xff0c;给排查问题造成很大不便&#xff0c;我们知道解决Java系统疑难杂症有两大利器&#xff0c;其一是tcpdump用于网络抓包分析 、其二是Btra…

智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应

水厂在生活中的重要性不可忽视。它们提供清洁、安全的水源&#xff0c;满足人们饮用、洗浴、烹饪等基本需求&#xff0c;保障公共卫生&#xff0c;预防疾病传播;同时&#xff0c;水厂也促进经济发展&#xff0c;为工业生产和农业灌溉提供保障&#xff0c;吸引和支持企业的投资和…

你的Jmeter是不是经常乱码?教你用四种方法解决它!

乱码的原因&#xff1a; 一般情况下jemeter默认设置的编码格式为&#xff1a;ISO-8859-1&#xff0c;而我们程序中经常使用的是UTF-8编码&#xff0c;由于响应页面和jmeter编码格式不统一导致响应结果中经常会乱码&#xff0c;所以需要将jmeter的编码格式设置为UTF-8来解决乱码…

ardupilot开发 --- EKF 篇

1. EKF1~EKF3 待续… 2. Ardupilot滤波算法的演变 使用DCM还是EKF? AHRS_EKF_USE: set to “1” to use the EKF, “0” to use DCM for attitude control and inertial nav (Copter-3.2.1) or ahrs dead reckoning (Plane) for position control. In Copter-3.3 (and highe…

day15_集合

今日内容 1.复习 2.LinkedList 3.Set(HashSet、TreeSet) 4.Map(HashMap) 一、复习 List集合的特点? 有序,允许重复 ArrayList的底层实现原理,以及特点 数组,初始10,扩容1.5倍查询更新快,删插入慢解释为什么快,慢? 增强for循环语法 写出以下几个集合的方法签名 向集合添加元素…

Unity URP14.0 自定义后处理框架

目录 碎碎念一些基础CustomPostProcessing.csCustomPostProcessingFeature.csCustomPostProcessingPass.cs例子&#xff1a;BSC后处理shader&#xff08;BSC&#xff09;后处理cs脚本(BSC) 例子&#xff1a;ColorBlitPostProcessing.hlslColorBlit2.shaderColorBlit.cs文件 其他…

快捷键记录

文章目录 ctrlaltashftwinsWinRCtrlc和CtrlvCtrl -Xshell的复制粘贴ctrlalt&#xff08;鼠标跳出&#xff09;ctrl alt T ctrlalta 这是QQ/TIM的屏幕截图快捷键。截图成功后&#xff0c;会有一栏导航&#xff0c;可以对图片进行勾画、模糊、绘画、标号、撤回、翻译、提取文…

早停止(Early Stopping)-PyTorch版本(代码使用教程)

一、说明 记录自己使用早停法来解决过拟合问题的经历。 这里给出的是pytorch版本&#xff0c;需要tensorflow版本的&#xff0c;可以使用chatgpt转换&#xff0c;也可以自己转换。 二、原理 这个早停法的原理就是&#xff0c;对比你每次的验证loss&#xff0c;如果超过20epoch&…

AQS总结

详细分析地址&#xff1a;跳转 head等于NodeA&#xff0c;NodeA指向NodeB&#xff0c;NodeB指向NodeC&#xff0c; tail等于NodeC。 NodeA也就是持有线程的Node&#xff0c;阻塞队列是指NodeA后面的所有队列&#xff0c;NodeA不属于阻塞队列。 公平锁&#xff1a; A线程先进来…

广西厂家直销建筑模板,工程用木工板,多层胶合板批发

欢迎选购我们的产品&#xff1a;广西厂家直销的建筑模板。作为一家专业厂家&#xff0c;我们提供工程用木工板&#xff0c;采用标准尺寸的多层胶合板制作&#xff0c;具备出色的防潮耐磨性能和高周转次数。 1. 工程用途&#xff1a;我们的建筑模板专为各类工程使用而设计&#…

(echarts)雷达图封装相关总结及使用

(echarts)雷达图封装相关总结及使用 数据结构&#xff1a; 页面&#xff1a; <div id"chart4" style"height:420px;width: 100%;" />//雷达图 echartFour(obj) {var chartDom document.getElementById("chart4");var myChart echarts.i…

浙大做了一个可用于AI领域的学术会议问答LLMs

深度学习自然语言处理 原创作者&#xff1a;wkk 今天介绍一篇来自于浙江大学的一项研究&#xff0c;关于基于LLM进行人工智能领域内7个不同学术会议QA数据集的论文。 论文: Reliable Academic Conference Question Answering: A Study Based on Large Language Model地址: http…

网络攻击的发展

在当今数字化时代&#xff0c;网站被攻击已经成为常态&#xff0c;网络威胁愈演愈烈。这些攻击不仅威胁到企业的安全&#xff0c;还可能导致严重的商业危机。本文将探讨为什么网络流量攻击变得如此普遍和容易&#xff0c;并分析未来可能引发的商业危机。 ​ 网络流量攻击的普遍…

【博士每天一篇文献-算法】iCaRL_ Incremental Classifier and Representation Learning

阅读时间&#xff1a;2023-10-27 1 介绍 年份&#xff1a;2017 作者&#xff1a;Sylvestre-Alvise Rebuffi; Alexander Kolesnikov; Georg Sperl; Christoph H. Lampert &#xff0c;牛津大学 期刊&#xff1a;Proceedings of the IEEE conference on Computer Vision and Pa…