P2564 [SCOI2009] 生日礼物
P2564 [SCOI2009] 生日礼物
题目翻译:
给你每个珠子的位置和种类,你要求出一个最小的区间,使里面包含所有种类的珠子。
思路:
我们可以发现,若一个区间的边缘上的珠子,在该区间内已经有了,那这个珠子就没必要拿,那我们只需要找到第一个包含所有的区间,在从左往又看,看这个珠子能否删去,若能,则删去,不能就继续往右加珠子,其中维护一个最小 \(ans\) 即可
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct A{
int x,op;
bool operator<(const A &q)const{return x<q.x;}
}a[N];
map<int,int>sum;
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1,cnt=0;i<=k;i++){
int t;
scanf("%d",&t);
while(t--){
int x;
scanf("%d",&x);
a[++cnt]={x,i};
}
}
sort(a+1,a+1+n);
int ans=1e9;
for(int l=1,r=1,kinds=0;r<=n;r++){
if(!sum[a[r].op]){
kinds++;
}
sum[a[r].op]++;
while(l<=r && sum[a[l].op]>=2){
sum[a[l].op]--;
l++;
}
if(kinds==k){
ans=min(ans,a[r].x-a[l].x);
}
}
printf("%d",ans);
}
本文作者:XichenOC
本文链接:https://www.cnblogs.com/XichenOC/p/18682405
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步