2024.3.11 训练记录(14)

继续补题

文章目录

  • 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();
	}
}

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

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

相关文章

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

如何改掉坏习惯?

每个人在生活中&#xff0c;多多少少都有一些根深蒂固的坏习惯。 比如&#xff1a; 闲暇无聊时总会下意识刷瀑布流、短视频&#xff0c;不知不觉就是一个小时过去&#xff1b; 明明说好要早睡&#xff0c;但睡前总是忍不住东逛逛、西看看&#xff0c;熬到实在撑不住了才上床&a…

uniapp运行钉钉小程序

因项目原因&#xff0c;公司需要在钉钉里面开发小程序。之前用uniapp开发过app&#xff0c;H5&#xff0c;小程序。还真没尝试过钉钉小程序&#xff0c;今天就简单的记录下uniapp运行钉钉小程序中的过程。 在项目目录新建package.json文件&#xff0c;在文件中添加如下代码&am…

计算机视觉研究院 | EdgeYOLO:边缘设备上实时运行的目标检测器及Pytorch实现

本文来源公众号“计算机视觉研究院”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;EdgeYOLO&#xff1a;边缘设备上实时运行的目标检测器及Pytorch实现 代码地址&#xff1a;https://github.com/LSH9832/edgeyolo 今天分享的研究…

如果利用AOP/Aspect来修改方法的入参

问题描述&#xff1a; 最近项目代码过三方测试&#xff08;国企项目&#xff09;&#xff0c;在一系列代码扫描审计检查下&#xff0c;代码发现一部分修改&#xff0c;例如请求参数发生了编码/加密&#xff0c;导致后台需要对请求的参数进行解码/解密&#xff0c;后端那么接口&…

山景BP1048 烧录器烧写

1.首先确保硬件连接没问题&#xff0c;烧写器不能亮红灯&#xff0c;亮红灯说明硬件没正确连接。硬件连接如下&#xff1a; 2.点击Flash Burner 3.编程目标闪存选择SDK包自带的烧写驱动器&#xff0c;闪存映像档选择编译好的bin文件。 4.点击刻录 5.看见有进度条在跑&#x…

MISC:杂项

一、文件类型识别 背景&#xff1a;遇到文件没有后缀&#xff0c;不知道文件类型。 方法一、使用Linux中的file命令 原理&#xff1a;file命令会识别文件的文件头&#xff0c;通过文件头识别出文件类型。 命令格式&#xff1a;file <filename> 而文件头则可通过010edito…

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率&#xff0c;又能获得很好的性能。 这两年 Flutter 技术热度持续提高&#xff0c;整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0&#xff0c;现在已经支持移动端、Web端和PC端&#xff0c;通过Flutter 开发的…

【设计模式】一、设计模式概述

文章目录 一、设计模式概述&#xff08;一&#xff09;设计模式是什么1. 设计模式的定义2. 设计模式的组成要素3、常用设计模式一览表 &#xff08;二&#xff09;设计模式的优点&#xff08;用途&#xff09;※ 本文小结 一、设计模式概述 &#xff08;一&#xff09;设计模式…

配置阿里云加速器

国内镜像中心常用阿里云或者网易云。在本地docker中指定要使用国内加速器的地址后&#xff0c;就可以直接从阿里云镜像中心下载镜像。 2024阿里云-上云采购季-阿里云 [rootlocalhost /]# mkdir -p /etc/docker [rootlocalhost /]# tee /etc/docker/daemon.json <<-EOF &…

第五十五天| 583. 两个字符串的删除操作、72. 编辑距离

Leetcode 583. 两个字符串的删除操作 题目链接&#xff1a;583 两个字符串的删除操作 题干&#xff1a;给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思考&#xff1a;动态规划。本题中…

网络原理(网络协议初识)

目录 1.网络通信基础 1.1IP地址 1.2端口号 1.3认识协议 1.4五元组 1.5 协议分层 2.TCP/IP五层&#xff08;或四层&#xff09;模型 2.1网络设备所在分层 2.2网络分层对应 3.封装和分用 1.网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#…

Maven简单入门

Maven 一&#xff1a;什么是Maven&#xff1a; Maven是一个项目管理工具&#xff0c;用于构建和管理Java项目。它可以帮助开发人员自动化构建过程&#xff0c;管理项目依赖关系&#xff0c;并协助项目的发布和部署。通过Maven&#xff0c;开发人员可以定义项目的结构、依赖关…

Dubbo:常见的面试题和答案

请关注微信公众号&#xff1a;拾荒的小海螺 1、什么是 Dubbo&#xff1f;它的作用是什么&#xff1f; 答&#xff1a; Dubbo 是一款高性能的 Java RPC 框架&#xff0c;是阿里巴巴公司开源的产品&#xff0c;用于提供高性能的分布式服务框架和面向服务的架构。Dubbo 的主要作…

网络编程套接字(4)——Java套接字(TCP协议)

目录 一、Java流套接字通信模型 二、TCP流套接字编程 1、ServerSocket ServerSocket构造方法&#xff1a; ServerSocket方法: 2、Socket Socket构造方法&#xff1a; Socket方法&#xff1a; 三、代码示例&#xff1a;回显服务器 1、服务器代码 代码解析 2、客户端…

C盘清理_

1.通过注册表来找没有删干净的文件 a.winr b.输入regedit,找到下图相应路径,开始查找,或是选择计算机ctrlf搜索对应的文件夹名

基于springboot+vue实现乌鲁木齐南山冰雪旅游服务网管理系统项目【项目源码+论文说明】

基于springbootvue实现南山冰雪旅游服务网演示 摘要 随着2022年北京冬奥会的成功举办&#xff0c;在冬天进行冰雪运动已经逐渐流行起来&#xff0c;人们慢慢享受到了冰雪活动给大家带来的欢乐&#xff0c;除此之外人们的身体素质也可以得到提升。虽然已经有一部分人可以接受并…

window server2012 卸载iis后,远程连接黑屏

原因分析&#xff1a; 因为自己在卸载IIS的时候&#xff0c;不小心卸载了.net framework&#xff0c;系统没有了图形界面&#xff08;由完整模式Full变为了核心模式core&#xff09;&#xff0c;需要重新恢复.net framework4.5。 解决方法分析&#xff1a; 需要将核心模式co…

WorldGPT、Pix2Pix-OnTheFly、StyleDyRF、ManiGaussian、Face SR

本文首发于公众号&#xff1a;机器感知 WorldGPT、Pix2Pix-OnTheFly、StyleDyRF、ManiGaussian、Face SR HandGCAT: Occlusion-Robust 3D Hand Mesh Reconstruction from Monocular Images We propose a robust and accurate method for reconstructing 3D hand mesh from m…

影城管理系统|基于springboot框架+ Mysql+Java+B/S架构的影城管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…
最新文章