首页 > 其他分享 >[JOI 2023 Final] Advertisement 2 题解

[JOI 2023 Final] Advertisement 2 题解

时间:2023-08-15 11:48:24浏览次数:45  
标签:std le 题解 source JOI Rie 居民 Final

题解

JOI 王国有 \(N\) 位居民,从 \(1\) 到 \(N\) 编号。居民 \(i\)(\(1\le i\le N\))居住在数轴上坐标 \(X_i\) 处,其影响力为 \(E_i\)。同一个坐标可能住了多于一位居民。居民的影响力越高,广告效应也越高,但买书也越谨慎。

Rie 出版了一本关于信息学的书。为了让更多人购买这本书,她可以给一些居民送书。如果她给居民 \(i\)(\(1\le i\le N\))送了一本书,除了居民 \(i\) 将得到一本 Rie 的书外,在还没有得到这本书的居民中,每一个满足以下条件的居民 \(j\)(\(1\le j\le N\))都会购买这本书:

  • 居民 \(i\) 和居民 \(j\) 在数轴上的距离小于或等于 \(E_i - E_j\)。换句话说,\(|X_i - X_j| \le E_i - E_j\) 成立。

如果所有的居民都读了 Rie 的书,信息学竞赛将得到极大的认可。请写一个程序,计算 Rie 最少将书赠送给多少位居民,就可以让 JOI 王国的所有居民都会得到 Rie 的书。

题解

考虑转化题目中的限制式

\[\left\lvert X_i - X_j\right\rvert \le E_i - E_j \]

首先拆开绝对值

\[X_i - X_j \le E_i - E_j \land X_j - X_i \le E_i - E_j \]

接下来移项

\[E_j - X_j \le E_i + X_i \land X_j + E_j \le E_i + X_i \]

考虑其几何意义,对于第 \(i\) 个人 \(\left(E_i, X_i\right)\),将 \(E_i - X_i\) 看作横坐标,将 \(E_i + X_i\) 看作纵坐标。将点 \(\left(E_i - X_i, E_i + X_i\right)\) 放到笛卡尔坐标系上,再结合限制式可以发现会受这个人影响的对应点处于该点和原点构成的矩形内。

考虑用尽可能少的点和原点组成的举行覆盖所有点,可以发现最终答案的断点一定是纵坐标随横坐标递增而递减的,使用单调栈维护即可。

Code

#include <bits/stdc++.h>

typedef int valueType;
typedef std::pair<valueType, valueType> ValuePair;
typedef std::vector<ValuePair> PairVector;
typedef std::stack<ValuePair> Stack;

int main() {
    valueType N;

    std::cin >> N;

    PairVector source(N);

    for (auto &iter: source) {
        valueType X, E;

        std::cin >> X >> E;

        iter = std::make_pair(E - X, E + X);
    }

    std::sort(source.begin(), source.end());

    Stack stack;

    for (auto const &iter: source) {
        while (!stack.empty() && stack.top().second <= iter.second)
            stack.pop();

        stack.push(iter);
    }

    std::cout << stack.size() << std::endl;

    return 0;
}

标签:std,le,题解,source,JOI,Rie,居民,Final
From: https://www.cnblogs.com/User-Unauthorized/p/solution-P9350.html

相关文章

  • SQL-三张表关联查询(INNER JOIN)
    使用场景】:现有A\B\C三张表,现在要查询并展示A表和C表中的某些字段,但是A、C两表没有相同字段,无法关联,此时有B表恰好有两个字段,一个字段和A表一个字段相同,一个字段和C表一个字段相同,我们称B表为“中间表”,因此通过B表把A、C表关联起来方法一(推荐):SELECTA1,A2,C1,C2--展示A......
  • 【免费分享 图书】《阿里云天池大赛赛题解析——深度学习篇》-PDF电子书-百度云
    找这本书的资源简直要把我找吐了,各种网站压缩包一下下来就开始各种套路(比如要你充钱)为了防止还有我这样的受害者,这就把找到的PDF给大家分享一下。链接在文章最后如果这篇文章能够帮到您,麻烦帮我点个赞,并关注一下我,我将有更多动力,持续分享更多有用图书给您!非常感谢,不胜感激!(点......
  • P3629 巡逻 LCA题解
    原题:洛谷P3629问题转化首先,给定的图是一个有\(n\)个点,\(n-1\)条边的无向连通图,这个图就等价于一棵树。不建立新的道路时,从\(1\)号节点出发,把整棵树上的每条边遍历至少一次,再回到\(1\)号节点,会恰好经过每条边两次,路线总长度为\(2(n-1)\),如下图最左边的部分所示。根据树......
  • SVN 不显示红绿图标问题解决方案
    本地文件夹我们先在桌面或者资源管理器中鼠标右键打开设置  选择IconOverlays(图标覆盖) Status cache(状态缓存)选择‘Shell’ 接着选择IconOverlays(图标覆盖)下的IconSet(图标集)  选择应用然后确认,重启生效     ssh等方式挂载的远程磁盘......
  • 2019考研英语(一)小作文真题解析与参考 Aiding Rural Primary Schools 答复信
    2019考研英语(一)小作文真题解析与参考Directions:Supposeyouareworkingforthe“AidingRuralPrimarySchools” projectofyouruniversity.Writeanemailtoanswertheinquiryfromaninternationalschoolvolunteer,specifyingthedetailsoftheproject.Yous......
  • 2023NepCTF-RE部分题解
    2023NepCTF-RE部分题解九龙拉棺过反调试很容易发现void__stdcallsub_401700()里面有tea的痕迹接出来发现只是前半部分#include<stdio.h>#include<stdint.h>#include"defs.h"#include<stdio.h>#include<stdio.h>#include<stdint.h>//加密函数......
  • CodeForces-1798#B 题解
    正文开个数组\(last_k\)统计\(a_{i,j}\)最后买彩票的时间,再开一排桶\(day_t\)记录该天最后买彩票的有哪些人(即:有\(p\)满足\(last_p=t\)的集合)。将\(last_k\)放入\(day_t\)中,判断\(day_t\)中是否存在空桶,若有则无解(因为没有人在当天是最后买彩票的)。因为本题是......
  • 题解 CF379D New Year Letter
    思路提供一种比较容易想到的做法。拿到题看数据范围发现都很小,所以放心大胆地暴力。容易发现\(s_i\)中AC的个数等于\(s_{i-2}\)中AC的个数加\(s_{i-1}\)中AC的个数再加上两者拼接处可能有的一个AC。所以\(s_1\)和\(s_2\)从第二个字符到倒数第二个字符这之间......
  • P4412 题解
    P4412题解传送门更好的阅读体验简化题意:一张无向图,给定一棵生成树,求最小的修改边权的代价使得这棵生成树是最小生成树,代价定义为修改前后一条边的边权变化量的绝对值。思路首先,发现让这棵树成为最小生成树不好直接处理,但是判定是否为最小生成树却相对更容易。判定的思路......
  • CF1845D Rating System 题解
    题面给定一个长度为\(n\)数列\(a\),保证每项都不为\(0\)。初始时\(x=0\),然后对于\(1\lei\len\),按顺序进行如下操作:如果\(x\gek\),则\(x\rightarrow\max(k,x+a_i)\),否则\(x\rightarrowx+a_i\)。你需要求出\(k\),使得\(x\)的值尽量大。题解如果我们不考虑\(k......