首页 > 其他分享 >【模板】动态凸包

【模板】动态凸包

时间:2022-08-18 07:22:14浏览次数:91  
标签:dn return first 凸包 second 动态 it2 模板 it1

好诶,我luogu帮我成功的交了一回codeforces了

\(\textrm{CF70D - Professor's task}\)

#include <stdio.h>
#include <map>
using namespace std;
#define llt long long int
map<int,int> up, dn;
llt cross(int a,int b,int x,int y) {
	return (llt)a*y-(llt)b*x;
}
bool find_up(int x,int y) {
	map<int,int> :: iterator it1 = up.lower_bound(x);
	if(it1 == up.end()) 
		return false;
	if(it1->first == x) 
		return y <= it1->second;
	if(it1 == up.begin()) 
		return false;
	map<int,int> :: iterator it2 = it1;
	--it2;
	return cross(it1->first-it2->first,it1->second-it2->second,x-it2->first,y-it2->second) <= 0;
}
bool find_dn(int x,int y) {
	map<int,int> :: iterator it1 = dn.lower_bound(x);
	if(it1 == dn.end()) 
		return false;
	if(it1->first == x) 
		return y >= it1->second;
	if(it1 == dn.begin()) 
		return false;
	map<int,int> :: iterator it2 = it1;
	--it2;
	return cross(it1->first-it2->first,it1->second-it2->second,x-it2->first,y-it2->second) >= 0;
}
bool delete_up(map<int,int> :: iterator it) {
	if(it == up.begin()) 
		return false;
	map<int,int> :: iterator it1 = it, it2 = it;
	--it1;
	++it2;
	if(it2 == up.end()) 
		return false;
	if(cross(it->first-it1->first,it->second-it1->second,it2->first-it1->first,it2->second-it1->second) >= 0) {
		up.erase(it);
		return true;
	}
	return false;
}
bool delete_dn(map<int,int> :: iterator it) {
	if(it == dn.begin()) 
		return false;
	map<int,int> :: iterator it1 = it, it2 = it;
	--it1;
	++it2;
	if(it2 == dn.end()) 
		return false;
	if(cross(it->first-it1->first,it->second-it1->second,it2->first-it1->first,it2->second-it1->second) <= 0) {
		dn.erase(it);
		return true;
	}
	return false;
}
void insert_up(int x,int y) {
	if(find_up(x,y)) 
		return;
	up[x] = y;
	map<int,int> :: iterator it1 = up.find(x);
	map<int,int> :: iterator it2 = it1;
	if(it1 != up.begin()) {
		--it2;
		while(delete_up(it2++)) 
			--it2;
	}
	if(++it2 != up.end()) {
		while(delete_up(it2--)) 
			++it2;
	}
}
void insert_dn(int x,int y) {
	if(find_dn(x,y)) 
		return;
	dn[x] = y;
	map<int,int> :: iterator it1 = dn.find(x);
	map<int,int> :: iterator it2 = it1;
	if(it1 != dn.begin()) {
		--it2;
		while(delete_dn(it2++)) 
			--it2;
	}
	if(++it2 != dn.end()) {
		while(delete_dn(it2--)) 
			++it2;
	}
}
int n;
signed main() {
	scanf("%d",&n);
	for(int i = 1, opt, x, y;i <= n;++i) {
		scanf("%d %d %d",&opt,&x,&y);
		if(opt == 1) {
			insert_up(x,y);
			insert_dn(x,y);
		} else {
			printf("%s\n",(find_up(x,y)&&find_dn(x,y)) ? "YES" : "NO");
		}
	}
	return 0;
}

标签:dn,return,first,凸包,second,动态,it2,模板,it1
From: https://www.cnblogs.com/bikuhiku/p/online_2D_convex_hull.html

相关文章

  • 对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成
    大家知道,DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新,按照我的理解就是把“......
  • vue学习之------vue-router【动态路由】
    动态路由的概念:把hash地址中的可变部分用【英文冒号(:)+参数】的形式进行定义获取动态路由的参数值:(1)第一种获取方式:可以直接使用$route.params对象访问到动态匹配的参数......
  • HTML 模板里面几个标签的含义
    HTML模板里面几个标签的含义告诉浏览器使用HTML的版本,以下表明是H5版本<!DOCTYPEhtml>告诉浏览器,这是英文页面。'zh'或者'zh-cn'代表中文<htmllang="en......
  • 【Mybatis】动态SQL
    目录动态SQLif语句动态SQLif+where语句动态SQLif+set语句动态SQLchoose(when,otherwise)语句动态SQLtrim语句动态SQLSQL片段动态......
  • zk学习案例_服务器动态上下线
    前言我的电脑内存只有8G,搭建的集群虚拟机配置如下,本案例也是可以跑的,学习视频为尚硅谷的Zookeeper教程:https://www.bilibili.com/video/BV1to4y1C7gw?p=1&vd_source=c85b......
  • windows ffmpeg2.8 动态库和静态库32位编译(hx264,opus)
    环境所有库都是在msys中进行32位编译msys环境安装修改msys程序目录的msys2_shell.cmd的remsetMSYS2_PATH_TYPE=inherit改为setMSYS2_PATH_TYPE=inherit......
  • 洛谷 P3157 [CQOI2011]动态逆序对
    Description对于序列\(a\),它的逆序对数定义为集合\[\{(i,j)|i<j\anda_i>a_j\}\]中的元素个数。现在给出\(1\simn\)的一个排列,按照某种顺序依次删除\(m\)个......
  • uniapp 动态设置当前页面的标题
    uni.setNavigationBarTitle(OBJECT)动态设置当前页面的标题。OBJECT参数说明参数类型必填说明titleString是页面标题successFunction否接口调用成......
  • flask模板与过滤器
    HTML:1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>Title</title>6</head>7<body>8hello9<br>10{......
  • 最大子段和动态规划
    【问题描述】八戒押x两银子,猫掌柜给定一个乱序数组arr,长度为N,有正数也有负数,正数表示赢钱,负数表示输钱。求arr的一个连续子数组,使得子数组的和最大,这样八戒才能尽可能......