2024.3.11 训练记录(13)

继续补题

文章目录

  • ICPC 2018青岛I Soldier Game
  • ICPC 2018青岛K Airdrop

ICPC 2018青岛I Soldier Game

题目链接

线段树

果然稍微复杂一点的线段树就很难实现啊,不看题解根本没反应过来是线段树

struct Node
{
	int l, r, lb, rb, nb, b;
} tr[N * 4];

其中:

  • lb 表示 a[l] 不包含在区间之内,即 a[l] 包含在 [l - 1, l]
  • rb 表示 a[r] 不包含在区间之内,即 a[r] 包含在 [r, r + 1]
  • nb 表示 a[l]a[r] 都不包含在区间之内,即 a[l] 包含在 [l - 1, l] 中,a[r] 包含在 [r, r + 1]
  • b 表示 a[l]a[r] 都包含在区间之内,即 a[l] 包含在 [l, l][l, l + 1] 内, a[r] 包含在 [r, r][r - 1, r]

合并操作可以看这张图:
在这里插入图片描述

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;

const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

int n;
int a[N];
struct Node
{
	int l, r, lb, rb, nb, b; // 分别表示左边界不包含 右边界不包含 两边界都不包含 两边界都包含
} tr[N * 4];

void pushup(Node& u, Node& l, Node& r)
{
	u.l = l.l, u.r = r.r;
	u.lb = min(max(l.lb, r.b), max(l.nb, r.lb));
	u.rb = min(max(l.b, r.rb), max(l.rb, r.nb));
	u.nb = min(max(l.lb, r.rb), max(l.nb, r.nb));
	u.b = min(max(l.b, r.b), max(l.rb, r.lb));
}

void pushup(int u)
{
	pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r)
{
	tr[u] = {l, r};
	if (l == r)
	{
		tr[u].lb = (l > 1 ? -INF : INF);
		tr[u].rb = (l == n ? INF : a[l] + a[l + 1]);
		tr[u].nb = INF;
		tr[u].b = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
	pushup(u);
	return;
}

void modify(int u, int pos, int len)
{
	if (tr[u].l == pos && tr[u].r == pos)
	{
		if (len == 1) tr[u].b = INF;
		else tr[u].rb = INF;
		return;
	}
	int mid = tr[u].l + tr[u].r >> 1;
	if (pos <= mid) modify(u << 1, pos, len);
	else modify(u << 1 | 1, pos, len);
	pushup(u);
}

Node query(int u, int l, int r)
{
	if (tr[u].l >= l && tr[u].r <= r) return tr[u];
	int mid = tr[u].l + tr[u].r >> 1;
	if (r <= mid) return query(u << 1, l, r);
	else if (l > mid) return query(u << 1 | 1, l, r);
	else
	{
		Node res;
		auto left = query(u << 1, l, mid);
		auto right = query(u << 1 | 1, mid + 1, r);
		pushup(res, left, right);
		return res;
	}
}

void solve()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ ) cin >> a[i];
	build(1, 1, n);
	vector<PIII> vec;
	for (int i = 1; i <= n; i ++ )
	{
		vec.push_back({a[i], {i, 1}});
		if (i != n) vec.push_back({a[i] + a[i + 1], {i, 2}});
	}
	sort(vec.begin(), vec.end());
	int ans = INF;
	for (int i = 0; i < 2 * n - 1; i ++ )
	{
		ans = min(ans, query(1, 1, n).b - vec[i].first);
		modify(1, vec[i].second.first, vec[i].second.second);
	}
	cout << ans << '\n';
}

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

	int t = 1;
	cin >> t;
	while (t -- )
	{
		solve();
	}
}

ICPC 2018青岛K Airdrop

题目链接

要说算法好像也没什么算法,原来金牌题也有纯思维吗,但是补得好困难啊

首先改变一下坐标轴,把 y = y0 作为 x 轴,因为所有人都是先上下再左右的,所以一定是先挪到 y 0 y_0 y0 这条线上再靠近 x 0 x_0 x0,同时处在 y 0 y_0 y0 两边的人是不可能相遇的,所以可以遍历 x 0 x_0 x0,判断处在左右两边的人对答案各贡献多少

下方以统计左侧为例说明统计方法

当然也是不能暴力统计的,我们注意到 x 0 x_0 x0 往右移的时候,左侧的人的曼哈顿距离都增加1,所以左侧原先贡献是多少,现在贡献还是多少

然后要看,上一次在 x = x 0 x=x_0 x=x0 上距离相等的点最多有 2 个,并且在 − d -d d d d d 的位置,这一次 x 轴右移,导致如果这两个点都存在,他俩就会撞死,同时还可能存在本来就在左侧的点和新出现在左侧的点曼哈顿距离一样,那他们就会一起撞死,只有这些情况的人数是1的时候才会对答案有1的贡献

我们只需要关注每个 x 和距离 x 为 1 的点

这题的另一个收获就是,开范围为 N 的数据结构时一定要开在最外面,开在里面会T

#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;

const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

unordered_map<int, int> mp[N];
vector<int> L(N), R(N);

void solve()
{
	int n, y0;
	cin >> n >> y0;
	vector<int> x(n + 1), y(n + 1);
	for (int i = 1; i <= n; i ++ )
	{
		cin >> x[i] >> y[i];
		y[i] -= y0;
	}

	vector<int> pos;
	for (int i = 1; i <= n; i ++ )
	{
		mp[x[i]][abs(y[i])] ++ ;
		for (int j = -1; j <= 1; j ++ ) pos.push_back(x[i] + j);
	}

	auto cal = [&](vector<int>& pos, vector<int>& f)
	{
		unordered_set<int> st;
		int dist = 0;

		f[pos[0]] = 0;
		for (int i = 1; i < pos.size(); i ++ )
		{
			int x_now = pos[i], lst = pos[i - 1];
			if (mp[lst].size() > 0)
			{
				for (auto t : mp[lst])
				{
					int yp = t.first, cnt = t.second;
					if (st.count(yp - dist) + cnt == 1) st.insert(yp - dist);
					else st.erase(yp - dist);
				}
			}
			dist += abs(x_now - lst);
			f[x_now] = st.size();
		}
		return;
	};

	sort(pos.begin(), pos.end());
	pos.erase(unique(pos.begin(), pos.end()), pos.end());
	cal(pos, L);
	reverse(pos.begin(), pos.end());
	cal(pos, R);

	int ans_max = 0, ans_min = INF;
	for (int i = 0; i < pos.size(); i ++ )
	{
		int xp = pos[i];
		int tmp = L[xp] + R[xp];
		if (mp[xp].size() > 0) for (auto t : mp[xp]) tmp += t.second;
		ans_max = max(ans_max, tmp);
		ans_min = min(ans_min, tmp);
	}
	cout << ans_min << ' ' << ans_max << '\n';

	for (int i = 0; i < pos.size(); i ++ ) mp[pos[i]].clear(), L[pos[i]] = R[pos[i]] = 0;
}

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

	int t = 1;
	cin >> t;
	while (t -- )
	{
		solve();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

帮管客 CRM jiliyu SQL注入漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统,客户管理,从未如此简单,一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传统,重新定义企业管理系统。 …

不知道吧,腾讯云轻量应用服务器使用有一些限制!

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的&#xff0c;比如轻量服务器不支持更换内网IP地址&#xff0c;不支持自定义私有网络VPC&#xff0c;内网连通性方面也有限制&#xff0c;轻量不支持CPU内存、带宽或系统盘单独升级&#xff0c;只能整个套餐整体升级&#x…

使用Git拉取代码时候出现error file write error no space left on device问题如何解决

1. 检查磁盘空间 首先&#xff0c;确认是哪个分区或驱动器满了。你可以使用以下命令来查看各分区的使用情况&#xff1a; 对于 Linux 或 macOS&#xff1a; df -h对于 Windows&#xff0c;你可以在“我的电脑”中查看各驱动器的剩余空间&#xff0c;或者在命令提示符&#x…

基于遗传算法改进的RBF神经网络流量控制,基于GA-RBF的流量预测

目录 完整代码和数据下载链接:基于遗传算法改进的RBF神经网络流量控制,基于GA-RBF的流量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88937452 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于遗传算法改…

力扣刷题Days15第二题-137. 只出现一次的数字 II(js)

目录 1&#xff0c;题目 2&#xff0c;代码 2.1哈希表 2.2 依次确定每一个二进制位 3&#xff0c;学习与总结 1. 左移运算符 (<<) 2. 有符号右移运算符 (>>) 3. 无符号右移运算符 (>>>) 1&#xff0c;题目 给你一个整数数组 nums &#xff0c;除…

不要在代码中随便使用try...catch了

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

PMP没过能考下一次吗?PMP·考试不过下次费用多少?

每年都有许多人参加PMP考试&#xff0c;然而&#xff0c;并不是每个人都能一次性通过PMP考试&#xff0c;许多人可能会面临失败。带你了解PMP补考费用以及补考流程 01PMP补考费用是多少 考生若未能成功通过考试&#xff0c;还可以在一年PMI有效期内提交补考申请&#xff0c;若…

【文件增量备份系统】使用Mysql的流式查询优化数据清理性能(针对百万量级数据)

文章目录 功能介绍原始方案测试 流式处理测试 功能可用性测试 功能介绍 清理功能的作用是&#xff1a;扫描数据库中已经备份过的文件&#xff0c;查看数据源中是否还有相应的文件&#xff0c;如果没有&#xff0c;说明该文件被删除了&#xff0c;那相应的&#xff0c;也需要将…

多线程多进程

秋招面试的java八股文知识点补充以及iot 这里有一点阅读补充 线程和进程区别 什么是进程? 进程 (Process) 是计算机中的一个独立执行单元&#xff0c;是操作系统资源分配的基本单位。每个进程有各自独立的内存空间和资源&#xff0c;它们之间相互独立&#xff0c;相互之间…

长期异地就医备案有效期是多久?答记者问!

4、长期异地就医登记的有效期是多长&#xff1f; 答&#xff1a;异地长期就医登记长期有效。 如果您因个人原因需要变更长期居住地&#xff0c;只需提供相应的登记信息即可申请变更。 5、临时异地就医登记的有效期是多长时间&#xff1f; 答&#xff1a;临时异地就医登记包括…

ORACLE RAC数据库压力测试(swingbench)

------------------------------------------------------------------- 欢迎关注作者 墨天伦:潇湘秦的个人主页 - 墨天轮 CSDN:潇湘秦-CSDN博客 公众号:潇湘秦的DBA之路 ------------------------------------------------------------------- 为了验证跑在虚拟机上的or…

【C++庖丁解牛】模拟实现STL的string容器(最后附源码)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.vs和g下string结构…

电机应用-步进电机进阶驱动

步进电机梯形加减速 什么是梯形加减速 假设该装置使用步进电机实现物体X的移动&#xff0c;系统要求从A点出发&#xff0c;到B点停止&#xff0c;移动的时间越短越好且系统稳定。 根据步进电机的特性&#xff0c;最大程度加大电机转速&#xff08;提高脉冲频率&#xff09;&a…

【脚本玩漆黑的魅影】全自动对战宫殿

文章目录 原理主要代码全部代码 原理 对战宫殿是让宠物自己打&#xff0c;不需要我们选技能&#xff0c;所以用来刷对战点数很合适。 需要准备三个主力。 主要是根据屏幕截图进行各种操作。 1&#xff0c;外面的对话&#xff0c;除了选自由级以外&#xff0c;其他都是直接点…

第十一个实验:数组和簇的混用,线性

实验内容: 输入5个元素的一维数组 显示每一个元素的值,索引和奇偶类型 第一步:新建项目 第二步:编程 创建一维数组,一共五个元素 ​​​ 选择数组索引部件 判断元素的奇偶性,把元素值,该元素索引和奇偶特性组成簇 复制4份,每一个元素一份

(day 2)JavaScript学习笔记(基础之变量、常量和注释)

概述 这是我的学习笔记&#xff0c;记录了JavaScript的学习过程&#xff0c;我是有一些Python基础的&#xff0c;因此在学习的过程中不自觉的把JavaScript的代码跟Python代码做对比&#xff0c;以便加深印象。我本人学习软件开发纯属个人兴趣&#xff0c;大学所学的专业也非软件…

MySQL技能树学习

MySQL三大范式&#xff1a; 第一范式主要是确保数据表中每个字段的值必须具有原子性&#xff0c;也就是说数据表中每个字段的值为不可再次拆分的最小数据单元。 第二范式是指在第一范式的基础上&#xff0c;确保数据表中除了主键之外的每个字段都必须依赖主键。 第三范式是在…

【设计模式】享元模式的使用场景及与其他共享技术的对比

文章目录 1.概述2.享元模式2.1.核心概念2.2.实现案例2.2.1.内部状态实现2.2.2.外部状态实现 2.3.更多场景 3.享元模式的一些对比3.1.与缓存的区别3.2.与池化技术的区别 4.总结 1.概述 享元模式&#xff08;Flyweight Pattern&#xff09;是一种非常常用的结构型设计模式&#…

实在TARS大模型斩获多项重磅大奖,AI领域实力认可

近日&#xff0c;实在智能TARS&#xff08;塔斯&#xff09;大模型凭借在多个垂直行业场景的优秀落地应用案例&#xff0c;以及AIGC领域的深耕和技术积累&#xff0c;荣获多项重磅大奖。 TARS大模型是是实在智能基于在自然语言处理&#xff08;NLP&#xff09;领域深厚的技术积…

MySQL常见的索引类型介绍

我将为您详细讲解 MySQL 中常见的索引类型&#xff0c;以及它们的使用场景、特点、区别和优势。索引是提高数据库查询性能的关键工具&#xff0c;它可以加速数据检索速度&#xff0c;减少服务器的负担。在 MySQL 中&#xff0c;索引类型主要包括 B-Tree 索引、哈希索引、全文索…