P8272

news/2024/11/16 21:50:31/文章来源:https://www.cnblogs.com/thirty-two/p/18549872

[USACO22OPEN] Apple Catching G

题目描述

天上下苹果了!在某些时刻,一定数量的苹果会落到数轴上。在某些时刻,Farmer John 的一些奶牛将到达数轴并开始接苹果。

如果一个苹果在没有奶牛接住的情况下落到数轴上,它就会永远消失。如果一头奶牛和一个苹果同时到达,奶牛就会接住苹果。每头奶牛每秒可以移动一单位距离。一旦一头奶牛接住了一个苹果,她就会离开数轴。

如果 FJ 的奶牛以最优方式合作,她们总共能接住多少个苹果?

输入格式

输入的第一行包含 \(N\)\(1\le N\le 2\cdot 10^5\)),为苹果落到数轴上的次数或 FJ 的奶牛出现的次数。

以下 \(N\) 行每行包含四个整数 \(q_i\)\(t_i\)\(x_i\)\(n_i\)\(q_i\in \{1,2\}, 0\le t_i\le 10^9, 0\le x_i\le 10^9, 1\le n_i\le 10^3\))。

  • 如果 \(q_i=1\),意味着 FJ 的 \(n_i\) 头奶牛在 \(t_i\) 时刻来到数轴上的 \(x_i\) 位置。
  • 如果 \(q_i=2\),意味着 \(n_i\) 个苹果在 \(t_i\) 时刻落到了数轴上的 \(x_i\) 位置。

输入保证所有有序对 \((t_i,x_i)\) 各不相同。


模拟赛被创死,展现出普及组选手 cfm 强大的普及水准。

什么时候 \(i\) 可以接住苹果 \(a\)?(\(t_i \ge t_a\)

  • \(x_i \ge x_a\) 时,有 \(t_i - t_a \ge x_i - x_a\)\(t_i - x_i \ge t_a - x_a\)
  • \(x_i < x_a\) 时,有 \(t_i - t_a \ge x_a - x_i\)\(t_i + x_i \ge t_a + x_a\)

赛时的时候列出了后面两个式子,但是仍然并不会这道题。

我们注意到后面两个式子一定同时成立!这一点在移向前的式子非常明显,因为 \(t_i - t_ a\ge |x_i - x_a|\)。但是移向后似乎就没有这么显然了(upd:其实也非常显然,上下两式相加得到 \(t_i \ge t_a\)……,反过来只要减一下就好了……)

因此令 \(t_i - x_i = x_i, t_i + x_i = y_i\),那么 \(i\) 可以接住苹果 \(a\) 的充要条件就是 \(x_i \ge x_a, y_i \ge y_a\)。(这里的 \(x\) 和上面的 \(x\) 不是一样的!)这是一个二维偏序问题,但一般的二维偏序是计数,这里是最优化:将数对匹配。

回顾二维偏序的过程,是先对 \(x\) 进行排序,然后利用数据结构维护 \(y\)。这里我们也按照 \(x\) 排序以此消除 \(x_i \ge x_a\) 的约束。对于每个奶牛 \(i\) 考虑把能吃掉的苹果放到集合 \(S\) 中。从 \(x\) 小的奶牛往 \(x\) 大的奶牛考虑。不考虑删除时这个 \(S\) 是在增长的。接下来考虑删除,显然 \(y\) 越小的苹果越难被匹配。所以从 \(y\) 尽量小的奶牛开始匹配。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5;
struct node {int opt, x, y, num;bool operator < (const node &other) const {return y < other.y;}
} Q[N + 10];
bool cmp(node &x, node &y) {return x.x > y.x;
}
multiset <node> S;int n;
vector <node> vec[3];
int main() {cin >> n;for(int i = 1, t, x; i <= n; i++) {cin >> Q[i].opt >> t >> x >> Q[i].num;Q[i].x = t - x, Q[i].y = t + x;vec[Q[i].opt].push_back(Q[i]);}sort(vec[1].begin(), vec[1].end(), cmp);sort(vec[2].begin(), vec[2].end(), cmp);int ia = 0, sum = 0;for(int i = 0; i < vec[1].size(); i++) {while(ia < vec[2].size() &&vec[2][ia].x >= vec[1][i].x) {S.insert(vec[2][ia]);ia++;}while(1) {if(!vec[1][i].num) break;set <node>::iterator it = S.lower_bound(vec[1][i]);if(it == S.end()) break;node tmp = (*it);if(tmp.num >= vec[1][i].num) {sum += vec[1][i].num;tmp.num -= vec[1][i].num;vec[1][i].num = 0;S.erase(it);S.insert(tmp);break;}else {sum += tmp.num;vec[1][i].num -= tmp.num;S.erase(it);}}}cout << sum << endl;
}

总结

真的是一个很值得反思反思的题目。

复盘过程

  • 在得到充要条件的一步,因为一般来讲是要根据 \(x\) 的大小讨论一下的。因此少前置约束是一个值得的动机。
  • 从另一个角度,以少前置约束出发就是 \(t_i - t_a \ge |x_i - x_a|\),等价于 \(t_i - t_a \ge x_i - x_a, t_i - t_a \ge x_a - x_i\) 同时成立。即 \(x \ge |y|\) 等价于 \(x \ge y, x \ge -y\)。这个变形我之前似乎没有用过,记下来
  • 于是得到了一个类二维偏序的匹配问题。对于一个高维问题,最常用的思想是降维。三位偏序二维偏序如此,高维前缀和如此,高维统计也如此。
    • 高维问题
      • 降维
      • 独立维度
  • 接下来的贪心中,是从“难以匹配”的奶牛和苹果出发。这也启发对于匹配类的贪心问题应该从“难以匹配”的元素出发思考策略。
    • 这是因为一般来说匹配问题不带权(比如这道题万一苹果带权似乎就不好贪心了)。难以匹配的赶紧匹配,容易匹配的放到后面匹配也没关系。这是“决策包容性”。
    • 关于这块似乎还要结合几个线段贪心详细总结总结

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

starrycan的pwn随笔——ELF文件和延迟绑定机制

一.ELF文件结构 0x01什么是ELF文件 1.linux环境中,二进制可持性文件的类型是ELF(Executable and LinkableFormat)文件。类似windows下的exe 2.elf文件的格式比较简单,我们需要了解的就是elf文件中的各个节、段等概念 3.程序elf的基本信息存在于elf的头部信息中,这些信息包括…

达梦数据库DM管理工具如何浏览数据,用条件筛选数据

前言 大家好,我是小徐啊。达梦数据库是我们一款常用的国产数据库,我之前一直在使用它。用起来和mysql和postgresql比起来,还是差不多的。而且它自带了数据库连接工具DM管理工具,使我们很方便的连接它。 今天,小徐就来介绍下如何用DM管理工具浏览数据,并且用条件去筛选数据…

标注图片怎么导出VOC格式和COCO格式

图片怎么标注参考 https://www.cnblogs.com/minseo/p/18549804下载 从github下载代码,或压缩包# git clone https://github.com/LabelMe/labelme转换 示例文件在以下路径# labelme-main\examples\instance_segmentation目录以及各个目录的用途如下打过标签的图片和json文件放以…

vscode Markdown文件如何使代码超出屏幕可视区域不换行

在编写Markdown文件的表格时,单元格内过长的内容会使得行超出可视区域,Markdown处理方式为单行用多行表示,如下图所示:这样会破坏表格的可读性,利用快捷键Alt+Z,可变为如下形式:使得表格每列对齐以增加可读性

20222325 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一…

[Linux]gdb基本使用

gdb基本使用 前提 gcc/g++编译出的程序默认是realease版本,要使用gdb调试,首先要在编译的时候加上-g选项。使用readelf -S [程序名]查看可执行文件的节区信息。使用gdb [程序名]:开始调试。q:退出调试。list/l [行号]:从给定的位置显示程序的源代码,每次十行。break/b [行…

美团商家联系电话采集软件团购外卖信息批量提取器

定义目标:明确需要采集的数据,如商家名称、地址、评分、销量等。 分析页面结构:通过浏览器的开发者工具,分析美团团购或外卖页面的HTML结构,找出包含所需数据的标签。 模拟用户请求:使用requests库模拟用户访问美团页面,可能需要处理登录、反爬虫机制(如Cookies、Heade…

# 团队作业4——项目冲刺-6

团队作业4——项目冲刺-6信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 在七天敏捷冲刺中,完成工大严选开发,记录每日进展和问题,更新燃尽图、签入代码,并发布集合日志总结成果GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗…

20222427 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1 本周内容总结使用了Metasploit框架,其是一个功能强大的渗透测试框架。在使用的过程当中,Metasploit 提供了种类繁多的攻击模块,涵盖了远程代码执行、服务拒绝、提权等多种攻击方式,支持对多种操作系统和应用程序进行测试。除了漏洞利用,它还具备强大的后渗…

20222306 2024-2025-1《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1内容回顾总结 这周都重点在于Metasploit工具的使用,我深入了解了对其功能和使用流程。Metasploit 是一个功能强大的渗透测试框架,广泛应用于网络安全领域。它为安全专家、渗透测试人员和红队提供了一个全面的工具集,支持漏洞利用、攻击模拟和安全评估。Metaspl…

关于HDFS路径文件夹名称的问题

问题发现 ​ 最开始的需求:修改/origin_data/gmall/db目录下所有以inc结尾的文件夹里的文件夹(名称为2024-11-15)修改为2020-6-14 问gpt写了个脚本: #!/bin/bash# 遍历 /origin_data/gmall/db 下所有以 "inc" 结尾的文件夹 for dir in $(hdfs dfs -ls /origin_da…

2024数据采集与融合技术实践-作业4

作业①: 1)使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 1.核心代码描述 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDri…