洛谷P11183 [ROIR 2018 Day2] 大数据处理

news/2024/11/14 13:18:16/文章来源:https://www.cnblogs.com/SkyNet-PKN/p/18545774

涉及知识点:动态开点线段树,贪心

前言

很妙很感性直观的贪心,做完神清气爽。

题意

有一个长为 \(2^k\) 的序列,编号从 \(0\) 开始,你要在上面染色,每次只能染色 \([k2^i,(k+1)2^i-1]\) 的区间(\(0\leq i<k\)),问最少要染色多少次才能变成给定的目标序列。目标序列以形如 \((x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)\) 的格式给出,表示从 \(0\) 开始有长为 \(x_1\) 的颜色为 \(y_1\) 的段,然后长为 \(x_2\) 颜色为 \(y_2\) 的段,以此类推。

\(k\leq 30,n\leq 10^5\)

思路

不难发现合法的染色区间其实就是原序列建出的线段树上的某个节点,于是问题转化为了在线段树上选一些点染色,每个叶子节点的颜色为距离它最近的被染色节点的颜色。为什么是距离最近的?因为我们肯定是先染长的段再染短的段最优(否则,先染短的就可能被后染的长的覆盖),对应线段树上就是先染浅的节点再染深的节点。

于是我们对目标序列建出一颗线段树,但是本题的空间肯定不允许我们建完整的线段树,可以考虑动态开点,假设当前节点对应的区间都是同一种颜色,就可以停止继续往下建了。这样建树在 update 一次时最多涉及 \(\log_2(2^k)=k\) 个节点,因此时空复杂度均为 \(O(nk)\)

注意:这样建出的线段树仍然满足普通线段树“要么没有儿子,要么有两个儿子”的性质,不存在只有左儿子或右儿子的情况。

接下来就在线段树上贪心,我们给每个节点开一个集合,意为“该节点所代表区间在最优策略下,如果被染色,那么可能染成的颜色”。首先叶子节点的集合肯定就只有它自己的颜色,\(ans=1\)。而对于非叶子节点,我们取它左右儿子的交集,如果这个交集不为空,我们就可以在这些颜色当中选一个作为当前区间的颜色,因此当前节点的集合为这个交集,且 \(ans\)\(ans_{lch}+ans_{rch}-1\);如果交集为空,那么当前节点为左右儿子并集,且 \(ans\)\(ans_{lch}+ans_{rch}\)

这是什么意思呢?当左右孩子中有交集时,说明左右孩子都存在某个区间染的颜色相同,因此直接在当前节点染而不是在左右孩子分别染,可以节省一次操作,由于在此处染色会“阻断”更上方的染色,因此交集外的颜色不用再被考虑。如果没有交集,那么该节点染成什么也不会更优,打包取并集交给更上方的节点处理。

还有一个问题,所谓这样的“阻断”会使得贪心错误吗?实际上是不会的,假设某处本应该取交集但取了并集,导致祖先某处应该取并集却取了交集,相当于为了一个小段,去染色了一个本该是其他颜色的大段,这一定是不优的。

例:

可自行尝试将上图黄圈所示部分本来取交集为(蓝)改为取并集(红+蓝),答案变劣。

代码

这里讲一下 STL 的科技 set_intersectionset_union,当然还有个 set_difference,但此处没用到。

set_intersection(a.begin(),a.end(),b.end(),b.end(),inserter(c,c.begin())) 表示求 ab 的交集存放到 c 中,其他两个同理。而且其时间复杂度为线性的,太伟大了 STL

#define getmid int mid=(l+r)/2
int K,n,m,full;
struct Node{Node *lch,*rch;int t,ans;set<int>s;Node(){lch=rch=nullptr;t=-1;ans=0;}
};
Node* rt=nullptr;
void update(Node* &pos,int l,int r,int ll,int rr,int col){if(pos==nullptr) pos=new Node;if(ll<=l && r<=rr){pos->t=col;return;}getmid;if(ll<=mid) update(pos->lch,l,mid,ll,rr,col);if(mid<rr) update(pos->rch,mid+1,r,ll,rr,col);
}
void solve(Node* pos){if(pos->lch==nullptr){assert(pos->rch==nullptr);pos->s.insert(pos->t);pos->ans=1;return;}else{solve(pos->lch);solve(pos->rch);pos->ans=pos->lch->ans+pos->rch->ans;set_intersection(pos->lch->s.begin(),pos->lch->s.end(),pos->rch->s.begin(),pos->rch->s.end(),inserter(pos->s,pos->s.begin()));if(!pos->s.empty()){pos->ans--;return;}pos->s.clear();set_union(pos->lch->s.begin(),pos->lch->s.end(),pos->rch->s.begin(),pos->rch->s.end(),inserter(pos->s,pos->s.begin()));}
}
int main(){rd(K);rd(n);rd(m);full=(1<<K)-1;for(int i=1,x,y,l=0;i<=n;i++){rd(x);rd(y);update(rt,0,full,l,l+x-1,y);l+=x;}assert(rt);solve(rt);wt(rt->ans);return 0;
}

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

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

相关文章

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)

1.简介 上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器。 2.eclipse中新建maven项目 1.依次点击eclipse的file - new - other ,如下图所示:2.在搜索框输入关键字“mav…

GPU 环境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 环境搭建

本文主要分享如何使用 GPU Operator 快速搭建 Kubernetes GPU 环境。1. 概述 上一篇文章 GPU 使用指南:如何在裸机、Docker、K8s 等环境中使用 GPU 分享了裸机、Docker 环境以及 K8s 环境中如何使用 GPU。 整个流程还算比较简单,但是因为需要在节点上安装 GPU Driver、Contai…

OpenCV开发笔记(八十二):两图拼接使用渐进色蒙版场景过渡缝隙

前言对于图像拼接,前面探讨了通过基于Stitcher进行拼接过渡和基于特征点进行拼接过渡,这2个过渡的方式是摄像头拍摄角度和方向不应差距太大。  对于特定的场景,本身摄像头拍摄角度差距较大,拉伸变换后也难做到完美的缝隙拼接,这个时候使用渐近过渡反倒是最好的。 Demo单…

【SageMath 9.3软件下载与安装教程】

1、安装包 SageMath 9.3: 链接:https://pan.quark.cn/s/e747450b98e1 提取码:vaMJ 2、安装教程(建议关闭杀毒软件) 1) 双击解压安装包安装,弹窗安装对话框2) 点击下一步3) 选择I accept,点击下一步4) 默认,点击下一步5) 默认文件夹,点…

【日记】感觉身体像僵尸(438 字)

正文不让人动真的是一种酷刑。今天实在受不了,在地上试了一下 Kick Out,结果发现还是老样子。可能稍微好了一点?说实话我不太能感受到。这已经休息了整整两周了,折磨得我死去活来。什么时候才能跳舞啊…… 我这膝盖还能不能好了……昨天应酬吃的东西感觉有问题。今天跑肚子…

第 4 篇 Scrum 冲刺博客

团队作业4——第 4 篇 Scrum 冲刺博客 作业要求这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13234这个作业的目标 团队集体协作完成项目开发队名 雄狮般的男人站立式…

鸿蒙Navigation知识点详解

Navigation是路由导航的根视图容器,一般作为页面(@Entry)的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换,通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题…

weblogic历史漏洞

weblogic历史漏洞 是什么?weblogic是一个web服务器应用(中间件),和jboss一样都是javaee中间件,只能识别java语言,绝大部分漏洞都是T3反序列化漏洞常见的中间件还有:Apache,nginx,IIS,tomact,weblogic,jboss等 默认端口:7001 Web界面:Error 404 -- Not Found 控制…

Z-Library 入口官方国内最新可用网址(2024持续更新)

Z-Library(简称 Z-Lib,前身为 BookFinder )是全球最大的电子图书馆之一,拥有1046万本书和8484万篇文章。Z-Library从2009年开始提供免费的电子书,至今遭遇了多次封锁,从2024年5月份也停止了国内的任何宣传渠道。所以便出现了很多Z-Library虚假域名(钓鱼网站),本文持续…

OVB

Homura 还在熟睡。 Madoka \(\text{[数据删除]}\)。“Homura 酱,快起床了。” “你看你看,这个是什么。” Madoka 指了指 Homura 的脖子下面。 Homura 醒了。 Madoka 指着的地方有一些黑黑的东西。 “看看这里写的什么,我 是 b a k a。” “啊啊啊啊啊,Madoka,你在干什么啊…

代码随想录算法训练营 | 200.岛屿的数量

岛屿的数量题目链接:https://leetcode.cn/problems/number-of-islands/此题目要点:dfs和bfs都可以解决此题,但是使用dfs代码会更加的简洁首先对grid进行遍历,每一个节点都进行检查,判断是否是1(陆地) 如果是,则进行dfs深搜,并将所有搜到的岛屿节点全置为0,表示此块岛…

5倍提升工作效率,智能合同审查开源系统助力律师行业智能化

一、系统概述 在法律行业,律师和法务人员每天需要处理大量的法律文件和复杂的案件信息。然而,手工分析和关联文档信息既耗时,又容易导致遗漏和错误。为此,我们推出了一款专为法律行业打造的开源免费软件,利用关系抽取算法和深度学习技术,支持自动识别底稿文档中的当事人、…