ZROI-21-CSP7连-DAY 7 T2

news/2024/10/18 19:57:53/文章来源:https://www.cnblogs.com/YzaCsp/p/18474573

题面

挂个 pdf
题面下载

算法

有点像扫描线?

容易想到离散化坐标点, 那么对于离散化之后的坐标 \(x\), 粗略来看, 其能分开区间的个数即为 \(\displaystyle\sum_{i = 1}^{n} \left[{l_i < x < R_i}\right]\)
这个可以用类似于差分的方法解决, 每次对于一个区间 \(\left(l_i, r_i\right)\) , 将其区间整体加 \(1\)
发现到可以用差分, 即将差分数组的 \(l_i + 1\) 位置加 \(1\), \(r_i\) 位置减 \(1\)
于是可以直接在离散化时按照 \(l_i + 1\)\(r_i\) 离散化

然后操作的时候需要注意: 离散化前后对应的区间长度改变
我使用 \(Back\) 数组记录离散化之前的真实坐标

对于每一个离散化之后的点, 都可以计算出其被覆盖的次数(差分数组求前缀和), 关键问题就在于怎么去对应到原序列上
可以发现(以下均为离散化之后的点) \(i, i + 1, i \in [1, \rm{farthest \text{ } position})\) 这两个点能够组成一个区间, 对于区间中的数, 其覆盖次数即为差分数组前缀和 \(i\) 的位置, 这个画画图就能出来
也就是说, 对于离散化之后的每一个位置, 我们依次计算前缀和相等的区间, 然后进行排序并处理

于是就可以写代码了

代码

#include <bits/stdc++.h>
#define int long long
const int MAXN = 1e5 + 20;
const int MAXSIZE = 2e5 + 20;int T;
int n, m;struct node
{int Left, Right;
} Sec[MAXN];
int Pos[MAXSIZE];
int Pos_cnt = 0;
int Back[MAXSIZE];void lsh()
{std::sort(Pos + 1, Pos + 2 * n + 1);Pos_cnt = std::unique(Pos + 1, Pos + 2 * n + 1) - (Pos + 1);for (int i = 1; i <= n; i++){int Now_Left = std::lower_bound(Pos + 1, Pos + Pos_cnt + 1, Sec[i].Left) - Pos;Back[Now_Left] = Sec[i].Left;Sec[i].Left = Now_Left;int Now_Right = std::lower_bound(Pos + 1, Pos + Pos_cnt + 1, Sec[i].Right) - Pos;Back[Now_Right] = Sec[i].Right;Sec[i].Right = Now_Right;}
}int Dif[MAXSIZE]; // 差分数组struct operation
{int Val; // 覆盖次数int Len; // 对应原序列上的长度
} Cut[MAXSIZE];
bool cmp(operation a, operation b) { return a.Val > b.Val; }int solve()
{/*离散化后, 对差分数组进行计算*/memset(Dif, 0, sizeof(Dif));int MaxPos = 0, Ans = 0;for (int i = 1; i <= n; i++){Dif[Sec[i].Right]--;Dif[Sec[i].Left]++;MaxPos = std::max(std::max(MaxPos, Sec[i].Right), Sec[i].Left);}/*覆盖次数计算*/for (int i = 1; i <= MaxPos; i++){Cut[i].Val = Cut[i - 1].Val + Dif[i];if(i != 1){Cut[i].Len = Back[i] - Back[i - 1];}}std::sort(Cut + 1, Cut + MaxPos + 1, cmp);for (int i = 1; i <= MaxPos; i++){int Cut_Num = std::min(m, Cut[i].Len);m -= Cut_Num;Ans += Cut_Num * Cut[i].Val;}return Ans;
}signed main()
{scanf("%lld", &T);for (int Case = 1; Case <= T; Case++){scanf("%lld %lld", &n, &m);Pos_cnt = 0;for (int i = 1; i <= n; i++){/*这里的 Sec 可以理解成对差分数组操作的区间*/scanf("%lld %lld", &Sec[i].Left, &Sec[i].Right);Pos[++Pos_cnt] = ++Sec[i].Left;Pos[++Pos_cnt] = Sec[i].Right;}lsh();printf("case #%lld: %lld\n", Case, solve() + n);}return 0;
}/*
2
3 1
1 3
2 4
1 4
3 3
1 3
2 4
1 4Case #1: 5
Case #2: 7
*/

总结

一般要离散化的题, 如果不好处理, 可以考虑:
对于不离散化的状态, 需要哪些信息?
然后将这些信息离散化即可解决问题

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

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

相关文章

计量经济学(十一)——联立方程模型的估计

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 联立方程模型(Simultaneous Equations Model, SEM)是一类包含多个相互依赖变量的统计模型,用来描述这些变量之间的相互关系。在传统的单一方程模型中,通常…

数据结构与算法 课程随记

数据结构与算法 课程随记因为有时候需要在不同设备编辑同一份文档,本地不太方便了,先在放着博客园比较省事吧。 但是博客园是不是快要四了啊,没事再整一个个人博客吧。 Class https://www.runoob.com/cplusplus/cpp-classes-objects.html大纲 定义成员函数,(无论public/pri…

pve安装后删除local-lvm并把其空间全部分给local

在安装pve的时候,系统默认分配给local的空间非常小,我们可以通过以下方法把local-lvm删除,并将其空间还给local。 在webui的pve节点的磁盘选项中找到LVM-Thin,删除data卷。删除后此处为空。 接着打开终端执行以下命令: lvresize --extents +100%FREE --resizefs pve/root此…

PYNQ Z2 读取xadc外部通道电压

使用XADC 或者JTAG只能读取XADC的内部电压, 而无法读取外部通道的电压 现在使用xsysmon.h库里面的函数进行XADC外部通道的电压 为了方便观察,增加了PL GPIO KEY LED进行观察 1. 配置ZYNQ70002.添加两个axi gpio并进行配置 AXI GPIO0AXI GPIO13. 添加XADC进行配置 这里选择axi l…

10.18 模拟赛

炼石计划 10 月 04 日 NOIP 模拟赛 #8【补题】 - 比赛 - 梦熊联盟 (mna.wang) 复盘 T1 有种 div.2 B 的风格,没秒,想看题。 T2。只判是否无解?\(k \le 100\)?把 \(200\) 个关键连通块拿出来建图跑传递闭包不就做完了。 一遍过大样例?简直不可思议,但还是把 T2 关了吧。 用…

小心!这样分享 B 站视频会暴露身份

已经有被开盒的案例了。‍ 在 2022 年 6 月 10 日 0 点,B 站在视频的网址上加了个参数 ?vd_source=XXXXXXXXXXXXXXX​,如图: ​ 经过网友的测试,这个参数值很可能就是用户 ID 的 hash 值(简单来说就是用户身份),所以如果直接复制网址的话,是有可能被“开盒”的。 ‍ 其…

局部静态变量的初始化观测

局部静态变量的初始化观测//全局变量int global=0x11111;int main(int argc, char* argv[]){ //局部变量 int temp=0x160; global=global+temp; return 0;}6: int global=0x111111;7: int main(int argc, char* argv[])8: {00401010 push …

想玩Steam游戏,但配置太低?ToDesk云电脑一招搞定!

在游戏爱好者的世界里,汇集了许多游戏大作的Steam平台无疑是一座宝库。但对于许多玩家来说,拥有一颗渴望畅玩游戏的心,却常常被低配置的电脑设备所束缚。尤其是面对硬件要求极高的3A大作时,低配置的电脑往往力不从心,卡顿、掉帧等问题让人苦恼不已。但别担心!小编最近发现…

孩子对手机有了渴望,家长该如何应对?ToDesk远程防沉迷

在现代生活中,手机已经成为我们密不可分的生活工具,日常工作社交生活都要靠手机来完成。 但近年来,手机的各类视频游戏等app诱惑在不断加大,导致孩子总是抱着手机不放,家长对此类问题头疼不已。 ToDesk远程控制软件可以另辟蹊径用远程控制软件解决掉孩子手机沉迷问题,只需…

vscode中整合豆包MarsCode编程助手

豆包MarsCode是字节跳动旗下的一款AI工具,最近在刷帖子时看到已经可以在vscode中通过插件安装MarsCode工具,接下来我们来看下操作流程以及使用效果。 第一步:首先需要注册下豆包账号 豆包 MarsCode--智能编码,一触即发! 第二步:打开vscode 后,左侧导航栏上点击扩展,搜索…

E-拼接串

题目: 思路:在已有的数组中寻找符合条件,也就是没有重复数字的子数组,以掩码的对应位的形式来表示当前子数组元素的存在,之后双重循环生成所有子数组,内层循环中,判断当前元素是否存在掩码中,存在则推出,不存在则加入掩码并标记。用另一个循环来更新 sum 数组,使得每…

低空经济如何实现商业化

随着技术的进步和政策的支持,低空经济正逐渐成为推动经济发展的新引擎。低空经济,主要指利用低空空域资源,通过有人驾驶和无人驾驶航空器的低空飞行活动,带动相关领域融合发展的综合性经济形态。当前,低空经济的商业化正面临前所未有的机遇与挑战。 技术突破是基础技术是推…