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

【题解】Luogu P1638 逛画展 Luogu P2564 [SCOI2009] 生日礼物

两道基本一样的题。

思路

考虑维护双指针 \(l\)\(r\),表示当前区间的两端点。

向后拓展 \(r\) 直到 \(m\) 个元素都包含在区间内。

接着考虑继续向后拓展 \(r\) 时如何保证在当前 \(r\) 固定的情况下区间合法且最小。

在整个拓展过程中,遇到重复元素,意味着此前出现过该元素的位置可以不被包含在区间内。

维护一个数组 \(p\),记录第 \(i\) 个元素出现的最后位置 \(p_i\)。在 \(r\) 向后拓展的过程中,判断 \(l\) 所在位置是否还需要保留在区间内,即 \(p_{a_l}\) 是否等于 \(l\)。如果等于,则 \(l\) 不变。如果大于,则 \(l\) 向后移动,继续判断下一项直到不能再向后移动。记录 \(m\) 个元素都包含在区间后对于每个 \(r\) 的区间信息,选择长度最小的区间输出。

时间复杂度 \(O(n)\)

实现

P1638 逛画展

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int M=2e3+10;
int n,m,cnt,l=1;
int ansl=1e9,ansr=2e9;
int a[N],p[M];
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;memset(p,-1,sizeof(p));for(int i=1;i<=n;i++){cin>>a[i];if(p[a[i]]==-1) cnt++;p[a[i]]=i;while(l<i&&l<p[a[l]]) l++;if(cnt==m&&i-l<ansr-ansl) ansr=i,ansl=l;}cout<<ansl<<' '<<ansr;return 0;
}

P2564 [SCOI2009] 生日礼物

位置值域来到了 \(2^{31}\) 且一个位置可存在多个元素。使用结构体记录元素位置,按位置排序即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int K=100;
int n,k,l=1;
int cnt,minl=INT_MAX;
int p[K],tot;
struct Node{int tpe,pos;
}a[N];
bool cmp(Node x,Node y){return x.pos<y.pos;
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>k;for(int i=1;i<=k;i++){int t;cin>>t;for(int j=1;j<=t;j++){int x;cin>>x;a[++tot].tpe=i;a[tot].pos=x;}}sort(a+1,a+1+n,cmp);memset(p,-1,sizeof(p));for(int i=1;i<=n;i++){if(p[a[i].tpe]==-1) cnt++;p[a[i].tpe]=a[i].pos;while(l<i&&a[l].pos<p[a[l].tpe]) l++;if(cnt==k&&a[i].pos-a[l].pos<minl) minl=a[i].pos-a[l].pos;}cout<<minl;return 0;
}
http://www.jsqmd.com/news/88912/

相关文章:

  • g++演示如何从C++代码到可执行程序
  • 详细介绍:Spring Boot 整合 Thymeleaf(视图层)
  • 电脑音频录制工具(语音聊天录音软件)
  • 【模板】静态区间最值【牛客tracker 每日一题】
  • Ascend C 与 CUDA 的对比分析-为异构计算开发者提供迁移指南
  • CF1004D Sonya and Matrix - crazy-
  • Markdown编辑完全指南
  • DAY37 早停策略和模型权重的保存
  • 西门子1200 PLC自由口通讯CRC校验程序实战
  • 【求解释】智子递归架构:基于互补递归与河洛调控的智能系统框架
  • Node.js `import.meta` 深入全面讲解
  • 影刀RPA发货大杀器!亚马逊订单批量发货效率提升2000%,告别手动煎熬![特殊字符]
  • CF1009F Dominant Indices - crazy-
  • 教程8:结构体的添加和使用-–-behaviac
  • 蓄电池与超级电容器混合储能并网的Simulink仿真探索
  • macOS 的两款好用的免费截图软件: shottr 和 snipaste
  • 教程9:枚举的添加和使用-–-behaviac
  • QSharedMemory 变量在对象析构的时候要怎么处理
  • TikTok达人合作订单太繁琐?影刀RPA一键智能处理,效率飙升10倍![特殊字符]
  • 投机推理原理及设计
  • 前端保存用户登录信息 深入全面讲解
  • 影刀RPA颠覆传统!TikTok售后工单智能处理,效率提升500%[特殊字符]
  • 【开题答辩全过程】以 基于PHP的乐高学习网站管理系统的设计实现为例,包含答辩的问题和答案
  • 【Java毕设全套源码+文档】基于springboot的高校大学生心理咨询管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 异步SAR Simulink模型及其在MATLAB仿真中的应用
  • 【开题答辩全过程】以 基于Node.js的医院预约挂号系统为例,包含答辩的问题和答案
  • vue基于Spring Boot框架的在线电影票购买系统的设计与实现_8xxt52nn
  • 学完这个C++内存池案例,你对内存管理的理解将超越大部份人
  • Cplusplus生成代码大小的说明-–-behaviac
  • 手把手拆解三菱PLC印字机实战项目