清理班次2
有代价线段覆盖模板题
注意: 我们应当按照右端点排序 而不是左端点 因为我们要的是右端点递增
在给线段排序之前 要考虑好左端点和右端点的排序顺序 是不是能够考虑到所有的情况
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=2e5+10;
const int INF=0x3f3f3f3f;
using namespace std;
int read()
{
int x=0,f=0,c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
int t[N<<2];
void add(int x,int l,int r,int pos,int val)
{
if(l==r){ t[x]=min(t[x],val); return;}//注意 最小值意义下的赋值
int mid=(l+r)>>1;
if(pos<=mid) add(x*2,l,mid,pos,val);
else add(x*2+1,mid+1,r,pos,val);
t[x]=min(t[x*2],t[x*2+1]);
}
int query(int x,int l,int r,int L,int R)
{
if(L<=l&&R>=r){ return t[x];}
int mid=(l+r)>>1;
int ans=INF;
if(L<=mid) ans=min(ans,query(x*2,l,mid,L,R));
if(R>mid) ans=min(ans,query(x*2+1,mid+1,r,L,R));
return ans;
}
struct Node
{
int x,y,z;
}p[N];
bool cmp(Node x,Node y){return x.y<y.y;}
int n,L,R,b[N],tot,f[N],cnt;
int main()
{
n=read(); L=read(); R=read();
for(int i=1;i<=n;i++)
{
int x=read(),y=read(),z=read();
if(y<L||x>R) continue;
b[++tot]=x; b[++tot]=y;
b[++tot]=x+1; b[++tot]=y+1;
p[++cnt]=(Node){x,y,z};
}
b[++tot]=L; b[++tot]=R;
sort(b+1,b+tot+1);
tot=unique(b+1,b+tot+1)-(b+1);
sort(p+1,p+cnt+1,cmp);
for(int i=1;i<=cnt;i++)
{
p[i].x=lower_bound(b+1,b+tot+1,p[i].x)-b,
p[i].y=lower_bound(b+1,b+tot+1,p[i].y)-b;
}
L=lower_bound(b+1,b+tot+1,L)-b;
R=lower_bound(b+1,b+tot+1,R)-b;
memset(f,0x3f,sizeof f);memset(t,0x3f,sizeof t);
add(1,0,tot,L-1,0);
for(int i=1;i<=cnt;i++)
{
f[p[i].y]=min(f[p[i].y],query(1,0,tot,p[i].x-1,p[i].y-1)+p[i].z);//右边界
add(1,0,tot,p[i].y,f[p[i].y]);
}
int ans=INF;
for(int i=R;i<=tot;i++)
ans=min(ans,f[i]);
if(ans==INF){puts("-1");return 0;}
printf("%d",ans);
return 0;
}
错误1: 线段树的边界问题
错误2: 如果离散化 那么对于无解的时候判断会出错
离散化这里有一个大坑:
虽然离散化之后相对大小不变,但是线段之间是否相邻的关系改变了
而我们在这两处用到了线段是否相邻:
1.判断答案是否有界 如果线段之间有空隙 那么是无解的
2. 转移的时候是要求在原本的线段上 相邻的才可以转移
我们的解决办法是人为的加上边界
//这个初始值赋值及其妙 会发现如果左端点小于L的话 那么选择当前的有可能更优秀
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」