「清新题精讲」CF260E - Dividing Kingdom

news2024/11/16 14:21:39

CF260E - Dividing Kingdom

D e s c r i p t i o n \mathrm{Description} Description

给定 n n n 个点 ( x i , y i ) (x_i,y_i) (xi,yi) 和长度为 9 9 9 的数列 a a a,满足 ∑ i = 1 n a i = n \sum_{i=1}^na_i=n i=1nai=n。通过 2 2 2 条平行于 x x x 轴的直线和 2 2 2 条平行于 y y y 轴的直线,将平面划分成 9 9 9 个部分,第 i i i 个部分点的数量记作 b i b_i bi

输出一组解满足 b b b a a a 的排列,或报告无解。

9 ≤ n ≤ 1 0 5 , 1 ≤ x i , y i ≤ 1 0 9 9\le n\le 10^5,1\le x_i,y_i\le 10^9 9n105,1xi,yi109

S o l u t i o n \mathrm{Solution} Solution

观察到排列二字, a a a 的长度还是 9 9 9,不难想到将 a a a 进行全排列,对于每一种情况分别计算。

上图给出了划分,其中标号为 i i i 表示格子内点数为 a i a_i ai。后面便需要对于 a a a 的一种排列,初步确定出 红色线 \color{red}{红色线} 红色线 蓝色线 \color{blue}{蓝色线} 蓝色线 的位置。不难发现,第 1 1 1 根红线下面点数应为 a 1 + a 4 + a 7 a_1+a_4+a_7 a1+a4+a7,第 1 1 1 根红线至第 2 2 2 根内点数应为 a 2 + a 5 + a 8 a_2+a_5+a_8 a2+a5+a8(对于蓝线也同理,这里不过多赘述)。

故,通过二分可以快速确定红蓝线的位置。不过,按照如上的确定方式,一定能保证对应块满足条件吗?答案是否定的。还需要判断每个小方格内是否点数是匹配的,即相当于求若干个矩形内的点数,与 P2163 [SHOI2007] 园丁的烦恼 有异曲同工之处(这里不再细说)。

当你写完提交后,发现不是 M L E \mathrm{MLE} MLE,就是 T L E \mathrm{TLE} TLE。分析代码消耗时间最多处,能知晓是计算 9 9 9 块常数太大,考虑优化。其实,由于前面特殊的划分方式,其实只需要计算 1 , 3 , 5 , 7 , 9 1,3,5,7,9 1,3,5,7,9 块即可,大大降低了时空复杂度(这里请读者自行理解)。

综上所述,即可通过理论时间复杂度为 O ( n log ⁡ n + 9 ! log ⁡ n ) O(n\log n+9!\log n) O(nlogn+9!logn) 的算法通过该题,不过由于常数过大,可以近似看做 O ( n log ⁡ 2 n + 9 ! log ⁡ n ) O(n\log ^2n+9!\log n) O(nlog2n+9!logn)

C o d e \mathrm{Code} Code

#include <bits/stdc++.h>
#define fi first
#define se second

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 2e5 + 10;

int n, m, k;
PII pnt[N];
int a[10], col[N], lin[N], qry[N * 20], idx, ans[4][N << 1];
std::vector<int> dct;
struct Query {
	int x, y, sign, id;
	bool operator< (const Query &tmp)const {
		if (y == tmp.y) {
			if (!sign) return 1;
			else if (!tmp.sign) return 0;
			return x < tmp.x;
		}
		return y < tmp.y;
	}
}q[N * 40];

int tr[N];
inline void add(int x, int d) { for (int i = x; i <= dct.size(); i += (i & -i)) tr[i] += d; }
inline int sum(int x) {
	int res = 0;
	for (int i = x; i; i -= (i & -i)) res += tr[i];
	return res;
}
inline int find(int x) {
	return lower_bound(dct.begin(), dct.end(), x) - dct.begin() + 1;
}
inline int binary(int aim, int v, int tmp[]) {
	int l = 1, r = dct.size();
	while (l < r) {
		int mid = l + r >> 1;
		if (tmp[mid] - v >= aim) r = mid;
		else l = mid + 1;
	}
	if (tmp[r] - v != aim) return -1;
	return r;
}
inline void add_query(int x1, int y1, int x2, int y2, int id) {
	q[ ++ idx] = {x2, y2, 1, id};
	if (x1 > 1) q[ ++ idx] = {x1 - 1, y2, -1, id};
	if (y1 > 1) q[ ++ idx] = {x2, y1 - 1, -1, id};
	if (x1 > 1 && y1 > 1) q[ ++ idx] = {x1 - 1, y1 - 1, 1, id};
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	cin >> n;

	for (int i = 1; i <= n; i ++ ) {
		cin >> pnt[i].fi >> pnt[i].se;
		dct.push_back(pnt[i].fi), dct.push_back(pnt[i].se);
	}

	sort(dct.begin(), dct.end());
	dct.erase(unique(dct.begin(), dct.end()), dct.end());

	for (int i = 1; i <= n; i ++)
		q[ ++ idx] = {find(pnt[i].fi), find(pnt[i].se), 0, 0};

	for (int i = 1; i <= 9; i ++)
		cin >> a[i];
	sort(a + 1, a + 10);

	for (int i = 1; i <= n; i ++)
		col[find(pnt[i].fi)] ++, lin[find(pnt[i].se)] ++;
	for (int i = 1; i <= dct.size(); i ++)
		col[i] += col[i - 1], lin[i] += lin[i - 1];

	do {
		int l1, l2, c1, c2;
		l1 = binary(a[1] + a[2] + a[3], 0, col);
		if (l1 == -1) continue;
		l2 = binary(a[4] + a[5] + a[6], col[l1], col);
		if (l2 == -1) continue;
		c1 = binary(a[7] + a[4] + a[1], 0, lin);
		if (c1 == -1) continue;
		c2 = binary(a[8] + a[5] + a[2], lin[c1], lin);
		if (c2 == -1) continue;
		ans[0][ ++ k] = l1, ans[1][k] = l2, ans[2][k] = c1, ans[3][k] = c2;
		qry[ ++ m] = a[3], add_query(1, c2 + 1, l1, dct.size(), m);
		qry[ ++ m] = a[9], add_query(l2 + 1, c2 + 1, dct.size(), dct.size(), m);
		qry[ ++ m] = a[5], add_query(l1 + 1, c1 + 1, l2, c2, m);
		qry[ ++ m] = a[1], add_query(1, 1, l1, c1, m);
		qry[ ++ m] = a[7], add_query(l2 + 1, 1, dct.size(), c1, m);
	}while (next_permutation(a + 1, a + 10));

	stable_sort(q + 1, q + 1 + idx);
	for (int i = 1; i <= idx; i ++)
		if (!q[i].sign)
			add(q[i].x, 1);
		else
			qry[q[i].id] -= q[i].sign * sum(q[i].x);

	for (int i = 1; i <= k; i ++) {
		bool flg = 1;
		for (int j = (i - 1) * 5 + 1; j <= i * 5; j ++)
			flg &= (!qry[j]);
		if (flg) {
			printf("%.1f %.1f\n%.1f %.1f\n", dct[ans[0][i] - 1] + 0.5, dct[ans[1][i] - 1] + 0.5, dct[ans[2][i] - 1] + 0.5, dct[ans[3][i] - 1] + 0.5);
			return 0;
		}
	}

	cout << -1 << endl;

	return 0;
}

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

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

相关文章

Mac连接虚拟机(Linux系统)

1.确定虚拟机的IP地址 ifconfig //终端命令&#xff0c;查询ip地址 sudo apt install net-tools 安装完成后再次执行 ifconfig&#xff1a; 2.安装SSH&#xff08;加密远程登录协议&#xff09; (1).安装OpenSSH服务器软件包&#xff1a; sudo apt-get install openssh-ser…

leetCode.86. 分隔链表

leetCode.86. 分隔链表 题目思路&#xff1a; 代码 class Solution { public:ListNode* partition(ListNode* head, int x) {auto lh new ListNode(-1), rh new ListNode(-1);auto lt lh, rt rh;for(auto p head; p; p p->next ) {if(p->val < x) {lt lt->…

33 mid 55. 跳跃游戏

贪心算法&#xff1a; class Solution {public boolean canJump(int[] nums) {int leftBorder 0;for (int i 0; i <nums.length; i) {if(i<leftBorder){leftBorderMath.max(leftBorder,inums[i]);}if(leftBorder>nums.length-1){return true;}}return false;} }

精酿啤酒:品质与口感对啤酒消费趋势的影响

随着消费市场的不断变化&#xff0c;啤酒消费趋势也在发生着演变。在这个过程中&#xff0c;品质与口感成为了影响啤酒消费趋势的重要因素。对于Fendi club啤酒而言&#xff0c;其卓着的品质和与众不同的口感对啤酒消费趋势产生了深远的影响。 品质的提升是推动啤酒消费趋势发展…

fastadmin部署后JSHint报错,导致Config::getValueByName()无法获取到值

问题 解决方案 一、本地 在phpstorm中&#xff0c;依次点击【设置】-【JSHint】-【取消勾选Enable】-【应用】即可。

Neural Filters:深度模糊

Ps菜单&#xff1a;滤镜/Neural Filters/摄影/深度模糊 Neural Filters/PHOTOGRAPHY/Depth Blur 深度模糊 Depth Blur滤镜可以在图像中创建环境深度以提供前景或背景对象。 “深度模糊”滤镜利用 AI 技术&#xff0c;分析图像的深度信息&#xff0c;生成一个深度图&#xff0c;…

爬虫案例-亚马逊反爬分析-验证码突破(x-amz-captcha)

总体概览&#xff1a;核心主要是需要突破该网站的验证码&#xff0c;成功后会返回我们需要的参数后再去请求一个中间页&#xff08;类似在后台注册一个session&#xff09;&#xff0c;最后需要注意一下 IP 是不能随意切换的 主要难点&#xff1a; 1、梳理整体反爬流程 2、验证…

【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【JavaScript】 文章目录 &#x1f33f; 引言五、 Destructuring Assignment - 解构赋值&#xff0c;数据提取的艺术 &#x1f3a8;&#x1f4cc; 数组解构&#x1f4cc; 对象解构&#x1f4cc; 特…

iOS自动连接已知Wi-Fi功能的实现

首先需要在配置文件申请的时候将hotspot勾选上&#xff0c;之后还要在x-code里添加对应的配置&#xff0c;由于我们并没有用到获取设备周边Wi-Fi的功能&#xff0c;所以就没申请相关权限 相关连接Wi-Fi代码如下&#xff1a; #import <NetworkExtension/NetworkExtension.h&…

LeetCode583:两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码 解法1 /*dp[i][j]&#xff1a;以i-1为结尾的wrod1中有以j-1为尾的word2的个数为了让word1和word2相同&#xff0c;最少操作…

排序专题(常见8种)【思路解析和代码实现】【2w字长文】

排序专题&#xff08;常见8种&#xff09; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中…

如何在文档中有效添加网格:技巧与实例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;为何添加网格至关重要 二、网格添加的基本步骤 1. 确定网格类型和样式…

解决 Echarts 图 tooltip 层级太高穿透问题

问题场景&#xff1a;Echarts 图 tooltip 是自动轮播的&#xff0c;当点击某个区域出现弹窗时&#xff0c;tooltip和弹窗同时显示&#xff0c;没在遮罩层下面&#xff0c;查看tooltip的层级显示99999&#xff0c;所以这里改一下tooltip的层级。 设置 extraCssText: "z-ind…

vue3 使用vant

使用前提&#xff1a; vite创建的vue3项目 vanthttps://vant-ui.github.io/vant/#/zh-CN/home npm i vant 引入样式&#xff1a; main.js import vant/lib/index.css vant封装 import { showLoadingToast,closeToast,showDialog,showConfirmDialog } from vant;export func…

使用docker部署项目

一、docker私有镜像仓库 1、docker私有镜像仓库 库&#xff08;Repository&#xff09;是集中存放镜像的地方&#xff0c;又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候&#xff0c;它实际上是从registry.docker.com这个地址去查找&#xff0c;这就是Docker公…

计量和测量的区别有哪些?两者的关系是什么样的?

计量和测量在行业内经常被混用&#xff0c;更不用说外行人对计量和测量的定义不够清晰&#xff0c;无论是看字面还是定义&#xff0c;似乎两者没有什么太大的区别&#xff0c;但实际上&#xff0c;两者还是有区别的&#xff0c;不过又存在千丝万缕的联系&#xff0c;那么计量和…

【惊艳视界】Perfectly Clear Workbench:让您的图像瞬间焕发生机!

在数字化时代&#xff0c;图像已成为我们生活中不可或缺的一部分。无论是摄影爱好者&#xff0c;还是专业设计师&#xff0c;都渴望拥有一款能够轻松提升图像质量的神奇工具。今天&#xff0c;我们为您带来了一款图像清晰处理软件的佼佼者——Perfectly Clear Workbench&#x…

009-Linux的管道和重定向

文章目录 前言 一、重定向 1.1、FD简介 1.2、FD举例 1.3、重定向简介 1.3.1、输出重定向 正确输出&#xff1a; 错误输出 案例1&#xff1a;正确输出重定向 案例2&#xff1a;错误输出重定向 ​编辑 案例3&#xff1a;正确和错误都输出重定向到相同位置 1.3.2、输…

学而后思,思学并进。学而不思则罔,思而不学则殆。

最后呢&#xff0c;我们学完这本书&#xff0c;读完这本书&#xff0c;得看他&#xff0c;这本书能不能去帮我们看清楚&#xff0c;很多的&#xff0c;现实社会中的事情的真实的本相&#xff0c;以及他所处的时代的事情的本相&#xff0c;因为学习&#xff0c;我们是为了学以致…

开源博客项目Blog .NET Core源码学习(28:App.Hosting项目结构分析-16)

本文学习并分析App.Hosting项目中后台管理页面的用户管理页面。   用户管理页面用于显示、检索、新建、编辑、删除用户数据&#xff0c;其附带一新建及编辑页面&#xff0c;以支撑新建和编辑用户数据&#xff0c;同时还附带重置密码页面&#xff0c;以重置用户密码。整个页面…