首页 > 其他分享 >P7561 [JOISC 2021 Day2] 道路の建設案

P7561 [JOISC 2021 Day2] 道路の建設案

时间:2023-11-28 10:36:29浏览次数:27  
标签:建設案 cur int Day2 cnt JOISC include check define

题意

给定 \(n\) 个点,求平面上,曼哈顿距离最近的 \(k\) 点对。

Sol

仔细想想就会发现,曼哈顿距离不好做最近 \(k\) 点对。

考虑转成切比雪夫距离。\(x' = x + y, y' = x - y\)。

二分答案,每次 \(check\) 一个 \(dis\),询问距离小于 \(dis\) 的点对是否有 \(k\) 个。

\(check\) 是平凡的,用尺取做掉一维数据结构维护另一维即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <set>
#include <cassert>
#define int long long
#define pii pair <int, int>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
#define fi first
#define se second

const int N = 2.5e5 + 5, inf = 1e10;

set <pii> isl;
array <pii, N> s;
array <int, N> cur;

int cnt;

bool check(int x, int n, int k) {
	int rd = 1;
	isl.clear(); cnt = 0;
	for (int i = 1; i <= n; i++) {
		rd = max(rd, i);
		isl.erase(make_pair(s[i].se, s[i].fi));
		while (rd < n && s[rd + 1].fi - s[i].fi <= x) {
			rd++;
			isl.insert(make_pair(s[rd].se, s[rd].fi));
		}
		auto it = isl.lower_bound(make_pair(s[i].se - x, -inf));
		/* if (i == 1 && it != isl.end()) { */
			/* write(s[i].fi), putchar(32); */
			/* write(s[i].se), puts(""); */
		/* } */
		for (; it != isl.end(); it++) {
			int tp = max(abs(it -> se - s[i].fi), abs(it -> fi - s[i].se));
			if (tp > x) break;
			cnt++, cur[cnt] = tp;
			if (cnt >= k) return true;
		}
	}
	return false;
}

signed main() {
	int n = read(), k = read();
	for (int i = 1; i <= n; i++) {
		int x = read(), y = read();
		s[i] = make_pair(x + y, x - y);
	}

	sort(s.begin() + 1, s.begin() + 1 + n);
	int l = 1, r = 1e10 + 5;
	int ans = -1;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (check(mid, n, k)) ans = r = mid;
		else l = mid + 1;
	}
	check(ans - 1, n, k);
	sort(cur.begin() + 1, cur.begin() + 1 + cnt);
	for (int i = 1; i <= cnt; i++)
		write(cur[i]), puts("");
	for (int i = cnt + 1; i <= k; i++)
		write(ans), puts("");
	return 0;
}

标签:建設案,cur,int,Day2,cnt,JOISC,include,check,define
From: https://www.cnblogs.com/cxqghzj/p/17861294.html

相关文章

  • Java learning Day2 常量 变量 运算符 Scanner 方法 数组
    常量:字面值常量(直接写值的常量)+自定义常量变量:long型变量后必须加L;小数字面值常量默认double 若用float需加F;变量强转:小的会自动转成大的float虽然只有4个字节但是比所有整型的取值范围都大    浮点型有精度问题  表达式类型提升:如果表达式当中存在多种数......
  • day2
    Chap2数据类型和操作常用内置类型整数Integer(int)浮点数Float布尔值Boolean(bool)​ 只有两种:True/False类型Type("类型"也是一种类型)​print(type(2))print(type(2.2))print(type(2<2.2))print(type(type(2)))<class‘int’><class'floa......
  • 机试题目-day2
    1.回文串问题把字符串中的大写都改为小写,并且把不是字母的字符删掉组成新的字符串原思路:都在原地址进行操作,此时会有各种问题现思路:组成一个新的字符串,用数组进行存储。问题又来了,如何知道新数组的长度呢?在编译的时候,无法你传进来的大小,因此要使用malloc申请内存。boolisPal......
  • Scrum冲刺博客-day2
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/CSGrade21-12这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13020这个作业的目标Scrum冲刺博客-day21.每日会议2.昨日已完成工作暂无,这是项目开始的第一天3.今日......
  • Java -day2
    三流程控制3.1scannerpsvm newScanner(System.in) alt+enter+enter  自动补全 Scannerscanner=newScanner(System.in);   3.2if3.3switch3.4while3.5for ......
  • java项目实战-spring-基本用法01-day24
    目录1.spring简单介绍2.IOC/DI--控制反转--是啥3.实现3.如果对象的属性为引用数据类型如何实例化对象4如何用注解的方式以少量的代码实现对象的创建于获取1.spring简单介绍https://spring.io什么事SSM?spring-mvcspring-framework--web服务层mybatis--......
  • java项目实战-mybatis-基本用法02接口绑定实现类-day23
    目录1.复习什么是接口什么是类?2.mybatis接口绑定实现类来实现查询3.参数的传递4插入数据1.复习什么是接口什么是类?publicinterfaceSpeak{voidsay();}Speak这个接口里面定义了say方法所有实现了Speak的类都必须实现say方法publicclassChineseimpl......
  • [BalticOI 2019 Day2] 汤姆的餐厅
    [BalticOI2019Day2]汤姆的餐厅题目背景译自BalticOI2019Day2T1.Tom'sKitchen题目描述Tom'sKitchen是一家非常受欢迎的餐厅,其受欢迎的原因之一是每份菜都由至少$K$名厨师进行准备。今天有$N$份菜需要准备,第$i$份菜的准备时间是$A_i$小时。Tom可以......
  • JOISC 2021 Day3 保镖
    Day\(\mathbb{P}_1+\mathbb{P}_2+\mathbb{P}_3+\mathbb{P}_4+\mathbb{P}_5+\mathbb{P}_6\)。放到二维平面上考虑,点\((x,y)\)表示\(x\)时刻在\(y\)位置上,那么第\(i\)顾客的路径可以看成起点为\((t_i,a_i)\),终点为\((t_i+|b_i-a_i|,b_i)\)的线段\(P_i\)。注意到一个......
  • 重新学习算法_Day2
    今天复习了栈先入后出和队列先进先出 ......