首页 > 其他分享 >[USACO22OPEN] Apple Catching G

[USACO22OPEN] Apple Catching G

时间:2023-11-10 18:22:39浏览次数:40  
标签:10 奶牛 USACO22OPEN Apple 数轴 le Catching 苹果 时刻

[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)$ 各不相同。

输出格式

输出 FJ 的奶牛总计能接住的苹果的最大数量。

样例 #1

样例输入 #1

5
2 5 10 100
2 6 0 3
2 8 10 7
1 2 4 5
1 4 7 6

样例输出 #1

10

样例 #2

样例输入 #2

5
2 5 10 100
2 6 0 3
2 8 11 7
1 2 4 5
1 4 7 6

样例输出 #2

9

提示

【样例解释 1】

在这个例子中,在 $t=5$ 时刻落地的 $100$ 个苹果均不能被接住。以下是一种接住 $10$ 个苹果的方式:

  • FJ 的所有六头 $t=4$ 时刻到达的奶牛各接一个 $t=8$ 时刻落地的苹果。
  • FJ 的一头 $t=2$ 时刻到达的奶牛接一个 $t=8$ 时刻落地的苹果。
  • 余下三头 $t=2$ 时刻到达的奶牛各接一个 $t=6$ 时刻落地的苹果。

【样例解释 2】

再一次地,在 $t=5$ 时刻落地的苹果均不能被接住。除此之外,在 $t=2$ 时刻到达的奶牛均不能接住 $t=8$ 时刻落地的苹果。以下是一种接住 $9$ 个苹果的方式:

  • FJ 的所有六头 $t=4$ 时刻到达的奶牛各接一个 $t=8$ 时刻落地的苹果。
  • 余下三头 $t=2$ 时刻到达的奶牛各接一个 $t=6$ 时刻落地的苹果。

 

解题思路

  考虑 $t_i$ 时刻 $x_i$ 位置上的奶牛可以接到哪些苹果,很明显这些苹果的 $t_j$ 和 $x_j$ 要满足 $x_j \in [ x_i - (t_j - t_i), \, x_i + (t_j - t_i) ]$,即

$$\begin{cases}
x_j \geq x_i - t_j + t_i \\
x_j \leq x_i + t_j - t_i
\end{cases}
\longrightarrow 
\begin{cases}
x_j + t_j \geq x_i + t_i \\
x_j - t_j \leq x_i - t_i
\end{cases}$$

  推到这里的时候卡住了,要同时满足两个条件不知道要怎么实现。其实可以先按照 $x_i - t_i$ 这个关键字从小到大排序,这样就把上式第二个条件固定了。其中在排序时对于 $x_i - t_i$ 相等的情况,应该优先让苹果排在前面,奶牛排在后面,因为现在是看奶牛能选哪些苹果。接下来只需要考虑第一个式子。

  从左到右依次枚举,用一个 $\text{std::multiset}$ 来维护前缀中剩余的苹果,当枚举到苹果时直接把 $x_i + t_i$ 和苹果数量压入集合中。如果枚举到奶牛 $i$,那么集合中满足 $x_j + t_j \geq x_i + t_i$ 的苹果都可以选。从贪心的角度,我们应该按 $x_j + t_j$ 从依次小到大来选择,这是因为 $x_j + t_j$ 越小,那么能接住这些苹果的奶牛越少,现在奶牛 $i$ 能接到应该优先选择。

  时间复杂度的计算,外层循环枚举 $n$ 个询问,当枚举到奶牛时又要内层循环枚举集合中的元素,看上去好像是 $O(n^2 \log{n})$ 级别的时间复杂度,实际上内层循环中每次不是把集合中的一个元素删掉(把某个时刻位置的全部苹果选完),就是把这群牛给删掉(接住的苹果达到上限),因此整个过程中内层循环执行次数是 $O(n)$ 级别的,因此时间复杂度应该是 $O(n \log{n})$。

  AC 代码如下:

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;

const int N = 2e5 + 10;

struct Node {
    int op, t, x, s;
    
    bool operator<(Node &a) {
        if (x - t != a.x - a.t) return x - t < a.x - a.t;
        return op > a.op;
    }
}q[N];

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d %d %d", &q[i].op, &q[i].t, &q[i].x, &q[i].s);
    }
    sort(q, q + n);
    multiset<PII> st;
    int ret = 0;
    for (int i = 0; i < n; i++) {
        if (q[i].op == 2) {
            st.insert({q[i].x + q[i].t, q[i].s});
        }
        else {
            auto it = st.lower_bound({q[i].x + q[i].t, -1});
            while (it != st.end()) {
                if (q[i].s <= it->second) {
                    ret += q[i].s;
                    if (q[i].s != it->second) st.insert({it->first, it->second - q[i].s});
                    st.erase(it);
                    break;
                }
                else {
                    ret += it->second;
                    q[i].s -= it->second;
                    it = st.erase(it);
                }
            }
        }
    }
    printf("%d", ret);
    
    return 0;
}

 

参考资料

   【题解】P8272 [USACO22OPEN] Apple Catching G:https://www.luogu.com.cn/blog/EricQian/solution-p8272

标签:10,奶牛,USACO22OPEN,Apple,数轴,le,Catching,苹果,时刻
From: https://www.cnblogs.com/onlyblues/p/17824768.html

相关文章

  • linux驱动模型--Apple的学习笔记
    一,前言既然是复习设备驱动,第一步当然是做一个最简单的基于设备树的驱动applechar,然后insmod和rmmod使用下,接着要回忆下driver和device是怎么match的,且把相关结构体复习下。看了下结构体发现有点忘记了,另外match的函数也忘记了。有些东西不需要死记硬背,通过代码分析的方法论找到它即......
  • House of apple 一种新的glibc中IO攻击方法 (2)
    目录Houseofapple一种新的glibc中IO攻击方法(2)前言利用条件利用原理利用思路利用_IO_wfile_overflow函数控制程序执行流利用_IO_wfile_underflow_mmap函数控制程序执行流利用_IO_wdefault_xsgetn函数控制程序执行流例题分析总结Houseofapple一种新的glibc中IO攻击方法(2......
  • 大总结:uboot复习--Apple的学习笔记
    一,前言发现现在的uboot做的越来像linux驱动了,包括了设备树及其驱动模型。所以若复习设备树的话,在linux上学习和在uboot上学习是一样的,再加上我学习过了qemu仿真,所以想找到单步仿真调试方法。主要是am335x的调试器当时我焊接失败,所以只考虑仿真,另外发现stm32F407也有uboot支持,所以研......
  • 开发板nfs挂载桥接虚拟机的文件系统环境搭建--Apple的学习笔记
    一,前言我之前虚拟机配置的是NAT方式,不是桥接,然后Kernel及uboot都同nfs挂载。所以先改成了最简单的桥接方式的虚拟机。二,ubuntu虚拟机设置1,vmware先设置为桥接。2,设置ubuntu14.04的静态ip地址gedit/etc/network/interfaces内容autoeth0ifaceeth0inetstaticaddress192.168.7.......
  • 开发板nfs挂载NAT虚拟机的文件系统环境搭建--Apple的学习笔记
    一,前言总体来说我还是想用NAT虚拟机,所以基于开发板nfs挂载桥接虚拟机的文件系统环境搭建--Apple的学习笔记中的配置继续修改。二,ubuntu虚拟机中nfs挂载设置修改ip地址为192.168.112.11添加路由端口sudogedit/etc/services最后添加mountd9999/tcpmountd9999/udpPC以太网2设......
  • IntelliJ IDEA在运行Applet小程序时中文乱码
    解决方法如下:第一种方法:在主界面点击文件→设置然后在设置界面选择编辑器→FileEncodings然后在下图所示界面的红框处,将utf-8改成GBK,确定保存即可第二种方法:在你所编辑的.java文件的右下方有一个编码方式,将其改为GBK然后点击convert即可.......
  • uboot的重定向汇编详细分析--Apple的学习笔记
    一,前言既然是第二轮学习,当然要比第一轮增加深度,获取更多技能和通用方法论。之前我想通过代码关闭relocate功能,结果一尝试就复位了,看来没我想的简单,还是先了解下relocate的代码。二,源码分析调用前r0有传参为gd->relocaddr,也就是一个指针地址保存在r0。arch/arm/lib/crt0.S ldr r0,......
  • apple M1 sd炼丹坎坷之路(一)
    用appleM1sd炼丹太费劲了,没钱换电脑,硬着头皮解决,折磨网上的大佬appleM1执行sd的视频/动图生成插件时报错AppleM1执行程序报错:raiseRuntimeError('AttemptingtodeserializeobjectonaCUDA'RuntimeError:AttemptingtodeserializeobjectonaCUDAdevicebuttorch.c......
  • Applescript成功实现imessage数据筛选,imessage蓝号检测,无痕检测手机号是否注册imess
    一、imessages数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写苹果MacOs......
  • uboot的Makefile添加c文件复制功能--Apple的学习笔记
    一,前言如何能快速知道哪些c被编译到boot了。通过看编译信息,通过看编译完成后的ouput文件夹中的o文件,能否直接copy这些c文件到某个文件夹中,这样搜索看代码定位比较容易。若makefile自己有全部的c路径,那么我做个脚本后处理下,copy这些路径的c即可,另外,makefile居然有复制o文件,那么我只......