2022 ICPC 南京 M Drain the Water Tank(叉积 + 思维)

news2024/11/17 2:43:09

2022 ICPC 南京 M. Drain the Water Tank(叉积 + 思维)

Problem - M - Codeforces

大意:给一个多边形 ,多边形充满水 , 点集逆时针给出 , 求最少的出水阀门的数量使得水可以全部流出。

思路:通过画图发现 , 我们要找的局部最低点只有两种情况 , 一种是 V 型 , 另一种是U型。即:

V型:

在这里插入图片描述

U型:

在这里插入图片描述

所以不难想出一个计数思路:那就是对于每个点顺时针方向和逆时针方向寻找是否有一个纵坐标大于自己的点。即找一个局部最低点 , 对于 U型来说我们只找纵坐标相等的逆时针方向的最后一个点。

但是这样计数会出现问题:

在这里插入图片描述

那就是局部最低点有的在图形内部 , 有的在图形外部。如何处理呢?

对于 V 型 , 由于点集逆时针给出 , 所以 用 toleft 测试 判断下一个点是否在当前向量的左边即可。

对于 U 型 ,由于我们判断的是纵坐标相同逆时针方向的最后一个点 , 所以它的横坐标大于前一个点的横坐标即可。

一定要注意 U 型不方便用叉积判断 , 用坐标判断即可

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;
const double eps = 1e-6;

int sign(double x){
	if(fabs(x) < eps) return 0;
	if(x > 0) return 1;
	return -1;
}

struct point{
	double x , y;
	point(){}
	point(double a , double b) : x(a) , y(b){}
}; 

double det(const point &a , const point &b){
	return a.x * b.y - a.y * b.x;
}

double toleft(point p , point a, point b) {
    point A = point(b.x - a.x , b.y - a.y); //向量ab
    point B = point(p.x - a.x , p.y - a.y); //向量ap
    return det(A , B);
}

int n;
point p[N];

inline nex(int x){ return (x + 1) % n; }
inline pre(int x){ return (x - 1 + n) % n; }

signed main(){

	cin >> n;
	for(int i = 0 ; i < n ; i ++){
		double x , y;cin >> x >> y;
		p[i] = point{x , y};
	}
	
	point xx , yy;
	
	int res = 0;
	
	for(int i = 0 ; i < n ; i ++){
		
		if(p[i].y == p[nex(i)].y) continue;
		//纵坐标相同只处理最后一个点
		
		bool tagp = 0 , tagn = 0;
		
		for(int j = pre(i) ; j != i ; j = pre(j)){
			if(p[j].y == p[i].y) continue;
			if(p[j].y >  p[i].y) {
				xx = p[j];
				tagp = 1;
				break;
			}
			if(p[j].y <  p[i].y) break;
		}//顺时针找高点
		
		for(int j = nex(i) ; j != i ; j = nex(j)){
			if(p[j].y == p[i].y) continue;
			if(p[j].y >  p[i].y) {
				yy = p[j];
				tagn = 1;
				break;
			}
			if(p[j].y <  p[i].y) break;
		}//逆时针找高点
		
		if(!tagp || !tagn) continue;//找不到退出
		
		if(p[i].y == p[pre(i)].y){// U型
			if(p[i].x > p[pre(i)].x) res += 1;
		}else{// V型
			if(sign(toleft(p[pre(i)] , p[i] , p[nex(i)])) == 1) res += 1;
		}
		
	}

	cout << res << "\n";

	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

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

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

相关文章

vector VS deque

1. vector与deque vector与动态数组相同&#xff0c;能够在插入或删除元素时自动调整自身大小&#xff0c;其存储由容器自动处理&#xff0c;vector通常占用多于静态数组的空间&#xff0c;因为要分配更多的内存以管理将来的增长&#xff0c;在每次插入元素的时&#xff0c;仅…

红外与可见光图像融合入门教学

红外与可见光图像融合入门教学 什么是红外与可见光图像融合论文DeepFuseDenseFuseRFN-NestFusionGANDDcGANAttentionFGANGANMcC 总结 博主目前马上进入研二阶段&#xff0c;也算是入门了红外与可将光图像领域&#xff0c;正好总结下&#xff0c;以供刚接触该领域的萌新们参考。…

ADC模块之HX711

今天&#xff0c;回顾了HX711模数转换模块&#xff0c;HX711模块经常用于电子秤的设计。 模数转换模块的输入有三种&#xff08;HX711的输入为差分输入&#xff09;&#xff1a; HX711的驱动程序 #include "HX711.h"//********************************************…

自考《00058 市场营销学》2023年4月历年真题答案

自考科目列表,自考本科,题库,自学考试,历年真题。 1.某汽车制造商宣称“我们的汽车唯一的缺点就是生产得不够快”,该公司秉持的营销哲学是 A.产品导向 B.推销导向 C.顾客导向 D.生产导向 2.LM公司故意不履行和中间商合同约定的相关义务&#xff0c;不按时支付供货商的货款&…

Java入职第十一天,深入了解静态代理和动态代理(jdk、cglib)

一、代理模式 一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 二、静态代理 无法根据业务扩展,…

火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 短视频正在成为越来越多人发现世界的窗口&#xff0c;其背后的创作者生态建设是各大短视频 APP 不可忽视的重要组成部分。 为了激励更多优质内容生产&#xff0c;某…

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构&#xff0c;它可以同时满足大数据存储和传统数据仓库的需求。具体来说&#xff0c;湖仓一体可以实现以下几个方面的功能&#xff1a; 数据集成&#xff1a; 湖仓一体可以集成多个数据源&#xff0c;包括结构…

exe打包工具(收录)

收录&#xff1a; Advanced Installation静默安装包的制作方法 Advanced Installer打包exe安装包教程 Advanced Installer使用指南 advanced installer 使用常见问题整理 exe打包工具&#xff1a;advanced installer介绍

使用飞桨实现的第一个AI项目——波士顿的房价预测

part1.首先引入相应的函数库: 值得说明的地方&#xff1a; &#xff08;1&#xff09;首先&#xff0c;numpy是一个python库&#xff0c;主要用于提供线性代数中的矩阵或者多维数组的运算函数&#xff0c;利用import numpy as np引入numpy&#xff0c;并将np作为它的别名 part…

这可能是你看过最详细的 [八大排序算法]

排序算法 前置知识 [排序稳定性]一、直接插入排序二、希尔排序三、直接选择排序四、堆排序五、冒泡排序六、快速排序七、归并排序八、计数排序&#xff08;非比较排序&#xff09;排序复杂度和稳定性总结 前置知识 [排序稳定性] 假定在待排序的记录序列中&#xff0c;存在多个…

Docker 将容器打包成镜像推送镜像到仓库

Docker 将容器打包成镜像&推送镜像到仓库 一、将容器打包成镜像 $ docker commit <容器ID> <镜像名称:标签>示例&#xff1a; $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

FreeSWITCH 1.10.10 简单图形化界面5 - 使用百度TTS

FreeSWITCH 1.10.10 简单图形化界面5 - 使用百度TTS 0、 界面预览1、注册百度AI开放平台&#xff0c;开通语音识别服务2、获取AppID/API Key/Secret Key3、 安装百度语音合成sdk4、合成代码5、在PBX中使用百度TTS6、音乐文件-TTS7、拨号规则-tts_command 0、 界面预览 http://…

JVM第一篇 认识java虚拟机

目录 1. 什么是java虚拟机 2. java虚拟机分类 2.1. 商用虚拟机 2.2. 嵌入式虚拟机 3.java虚拟机架构 4.java虚拟机运行过程 1. 什么是java虚拟机 传统意义上的虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的&#xff0c;是操…

Python在电路课程中的应用

1 需求 课程中有大量的计算&#xff0c;电路方程、复数计算&#xff0c;之前都是用的MATLAB online&#xff0c;可现在要过期了&#xff0c;只能更换平台。 2 工具 https://www.online-python.com/ Python3 在线工具 | 菜鸟工具 (runoob.com) 3 Sinusoid 章节 涉及到复数计…

AI绘图(11)stable diffusion 如何写好prompt四

在最开始我写了三篇关于prompt的&#xff0c;具体的大家可以跳转来去看&#xff0c;以下给出来链接&#xff1a; AI绘图&#xff08;3&#xff09;stable diffusion如何写好prompt 一_牧子川的博客-CSDN博客 AI绘图&#xff08;4&#xff09;stable diffusion如何写好prompt …

无涯教程-聚类算法 - Mean-Shift

如前所述&#xff0c;它是在无监督学习中使用的另一种强大的聚类算法&#xff0c;与K均值聚类不同&#xff0c;它不做任何假设&#xff0c;因此&#xff0c;它是一种非参数算法。 均值平移算法基本上是通过将数据点移向最高密度的数据点(即群集质心)来迭代地将数据点分配给群集…

Modbus协议详解1:Modbus的简介

Modbus协议是应用非常广泛的一种通信协议规约&#xff0c;也是最早应用在工业现场的协议。 早在1979年出现工业串行链路以来&#xff0c;Modbus的应用就开始普遍起来&#xff0c;它使得各种自动化设备之间的互相通信得到实现&#xff0c;做嵌入式产品开发的朋友应该不会陌生&am…

RT1050的ADC

文章目录 1 ADC介绍2 ADC框图2.1 外部输入通道2.2 输入电压范围2.3 触发源2.4 时钟源2.5 偏移矫正功能2.5.1 校准 1 ADC介绍 RT1052 有 2 个 ADC&#xff0c;每个 ADC 有 12 位、10 位、8 位可选&#xff0c;每个 ADC 有 16 个外部通道。 ADC具有最高 1MS/s 采样率支持单次或…

ubuntu安装goland

下载并解压goland sudo tar -C /opt/ -xzvf goland-2023.1.3.tar.gz配置应用图标 新建文件&#xff1a; vim /usr/share/applications/goland.desktop文件中写入如下内容&#xff1a; [Desktop Entry] TypeApplication NameGoLand Icon/opt/GoLand/bin/goland.png Exec/op…

uni-app 分不清的全局变量this, uni, $u, vm, uni.$u, this.$u

项目引入了uview,并将uview所有模块指给uniapp全局变量uni uni.$u$u 在登录页面&#xff0c;或者APP.vue打印以下变量&#xff1a; this, uni, $u, vm, uni.$u, this.$u