[Tkey] 生日礼物
题意简述
彩珠有
分析
发现我们可以维护每一种颜色的最近出现坐标.
因为是最近的出现坐标,所以离现在的距离(即答案)一定是更优的,那么我们用这个值来更新答案一定就是最优的.
假如我们想要让当前值更新答案,那么我们就需要让全部的颜色都在区间里出现过,也就是去寻找全部颜色的出现坐标的最小值,然后用当前坐标去减就行了.
突然发现能用线段树建在
然后就秒了.
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct node{
int id,color;
bool operator <(const node &A)const{
return id<A.id;
}
}a[1000001];
struct tree{
int l,r;
int min;
}t[241];
#define tol (id*2)
#define tor (id*2+1)
#define mid(l,r) mid=((l)+(r))/2
void build(int id,int l,int r){
t[id].l=l;t[id].r=r;t[id].min=-1;
if(l==r){
return;
}
int mid(l,r);
build(tol,l,mid);
build(tor,mid+1,r);
}
void change(int id,int p,int val){
if(t[id].l==t[id].r){
t[id].min=val;return;
}
if(p<=t[tol].r) change(tol,p,val);
else change(tor,p,val);
t[id].min=min(t[tol].min,t[tor].min);
}
int ask(){
return t[1].min;
}
int main(){
int cnt=0;
ios::sync_with_stdio(false);
cin>>n>>k;int x,y;
for(int i=1;i<=k;++i){
cin>>x;
while(x--){
cin>>y;
a[++cnt]={y,i};
}
}
build(1,1,k);
sort(a+1,a+n+1);int ans=0x7fffffff;
for(int i=1;i<=n;++i){
// cout<<i<<" color : "<<a[i].color<<" id: "<<a[i].id<<endl;
change(1,a[i].color,a[i].id);
if(ask()!=-1){
// cout<<"can "<<ask()<<" "<<a[i].id-ask()<<endl;
ans=min(ans,a[i].id-ask());
}
}
cout<<ans;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!