当前位置: 首页 > news >正文

【贪心】选择尽量多的不相交区间

参考链接

问题:跟定n个开区间(a,b)或闭区间[a,b],选择尽量多个区间,且这些区间互不相交。

贪心策略:将每个区间按右端点从小到大排序。遍历所有的区间,如果当前区间的左端点和最长区间的右端点相冲突,直接放弃,否则选取。
模版题
AC代码

#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e6+5;structqj{ints,f;friendbooloperator<(qj x,qj y){if(x.f==y.f)returnx.s<y.s;returnx.f<y.f;}}a[maxn];intn,ans,last;intmain(){cin>>n;for(inti=1;i<=n;i++)cin>>a[i].s>>a[i].f;sort(a+1,a+n+1);last=1,ans=1;for(inti=2;i<=n;i++){if(a[i].s>=a[last].f){++ans;last=i;}}cout<<ans;return0;}

进阶题
这题题目明确给出了不相交区间,我们不难想到模版题。但是这道题需要转一下弯:这里的区间是怎么构成的呢?
拿数据举例:

422103

找权值为2的区间,我们不难想到前缀和的思想。开一个数组s,s[t]存储a[1]^ a[2] ^ … ^ a[t]的结果。找权值为2的区间[l,r]就是找s[l-1]^s[r]=2的l,r。
why? 因为同一个数异或偶数次,结果为0,s[r]的计算过程中有s[l-1]的计算,再异或一次s[l-1],就抵消了a[1] ^ … ^ a[l-1]的结果。s[l-1] ^ s[r]求到的就是a[l]^ … ^a[r]的结果。
那怎么找满足s[l-1]^s[r]=k的区间[l,r]呢?我们按下标顺序枚举左端点,计算每个左端点找到与之匹配的右端点的条件:s[r]=s[l-1] ^ k。
我们一步步拆解来说:
1:s[r]=s[l-1] ^ k是什么?
要找s[l-1] ^ s[r]=k,等号两边同时异或s[l-1],得到的就是s[r]=k^s[l-1],我们枚举l,s[l-1]已知,k已知,就看如果s[r]=k ^ s[l-1]说明[l,r]权值为k。

2:如何使用选择尽可能多不相交的区间?

a数组下标01234
元素值02103
s数组下标01234
元素值02330

我们另开一个数组h,初始化h数组元素为-1。当s[l]^k=i时,h[i]=l。这样当找到s[r]=i时,我们就可以通过数组h找到l,区间[l+1,r]就是一个满足权值为k的区间。另外,我们开个变量last(初始化为-1)记录上一个满足条件的区间右端点的值。如果当前区间满足条件,且左端点比上一个满足条件的区间的右端点要大说明两个区间不相交,答案+1。
举例来说,变量i遍历s数组,
·i=0,s[i]=0,h[0]=-1,说明暂时没有匹配到满足的左端点,不处理。然后记录h[2]=0;
·i=1,s[1]=2,h[2]=0,匹配到了左端点为h[2]+1,然后看一下左端点的值是否大于last,是则ans++,last=i。然后记录h[0]=1;

h数组下标01234
元素值1-10-1-1

·i=2,s[i]=3,h[3]=-1,说明暂时没有匹配到满足的左端点,不处理。然后记录h[1]=2;
·i=3,s[i]=3,h[3]=-1,说明暂时没有匹配到满足的左端点,不处理。然后记录h[1]=3;
h数组:

h数组下标01234
元素值130-1-1

·i=4,s[i]=0,h[0]=1,匹配到了左端点为h[0]+1,大于last,ans++,last=i。于是找到了两个不相交的区间。记录h[2]=4。

h数组:

h数组下标01234
元素值134-1-1

3:在代码实现上要注意:a<=2^20,s数组要开到2e6比较保险。
AC代码:

#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2e6+5;intn,k,a[maxn],s[maxn],h[maxn];intmain(){cin>>n>>k;for(inti=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]^a[i];}for(inti=0;i<=n;i++)h[i]=-1;h[0^k]=1;intlast=0,ans=0;for(inti=1;i<=n;i++){if(h[s[i]]!=-1&&h[s[i]]>last){++ans;last=i;}h[s[i]^k]=i+1;}cout<<ans;return0;}
http://www.jsqmd.com/news/487722/

相关文章:

  • 对象解构赋值:接口数据解包 10 个实战写法|JS 基础语法与数据操作篇
  • 蓝桥杯(排序)
  • mPLUG VQA图文问答实战:跨境电商商品图多语言描述自动生成
  • java之继承和多态的认识
  • 计算机毕业设计springboot温州商学院职称评审系统 基于Spring Boot的温州商学院教师职称评审管理系统设计与实现 温州商学院职称评审平台的Spring Boot架构开发
  • DeepSeek-OCR在AI办公中的应用:会议纪要OCR→Markdown→Notion同步
  • Unity面试总结
  • 雯雯的后宫-造相Z-Image-瑜伽女孩提示词模板库:20组已验证瑜伽体式+环境+服饰组合
  • LM Studio 国内高效使用指南:从下载到模型部署全流程解析
  • ssm+java2026年毕设勤工俭学管理系统【源码+论文】
  • map/filter/reduce:数组10个常用实战操作|JS 基础语法与数据操作篇
  • PIM 协议
  • C语言洛谷刷题总结7(题单【入门6】函数与结构体)
  • kkFileView 源码编译实战:从零构建最新预览服务安装包
  • 淡入淡出的button控件,源代码
  • Agentic AI提示工程:多任务学习策略的实战经验
  • # 英语听力提升方法(适合词汇量约1200的学习者)
  • 解决VSCode Remote-SSH连接失败的常见问题与排查方法
  • 【Java从入门到入土】06:String的72变:从字符串拼接到底层优化
  • 代码随想录算法训练营第九天 | 翻转字符串里的单词 、右旋转字符串
  • Qwen3-TTS-Tokenizer-12Hz实战案例:有声书制作中章节音频统一token化方案
  • SpikeTrack: A Spike-driven Framework for Efficient Visual Tracking—— 一种用于高效视觉追踪的脉冲驱动框架
  • VSCode结合EmmyLua实现Lua代码高效调试指南
  • 深入解析javax.net.ssl.SSLHandshakeException:如何修复No negotiable cipher suite错误
  • 计算机网络基础:网络互联与核心设备 | 0基础入门必看
  • MedGemma 1.5保姆级教程:从Docker拉取镜像到浏览器访问6006端口
  • Qwen Pixel Art保姆级教程:从Docker安装到提示词工程(含20个优质模板)
  • ssm+java2026年毕设清空购物商城系统【源码+论文】
  • VideoAgentTrek-ScreenFilter在开源社区的应用:自动净化项目演示视频
  • ssm+java2026年毕设情报综合管理系统【源码+论文】