JZOJ 捕老鼠
题目
实际上经转换得:
给了 条线段,求覆盖 需要的最少条数
分析
设 表示覆盖了 时需要的最少的线段数
那么 的转移是这样的
#include<cstdio> #include<iostream> using namespace std; const int N = 5e5 + 5; int n , a[N] , f[N]; int main() { scanf("%d" , &n); for(register int i = 1; i <= n; i++) scanf("%d" , a + i) , f[i] = N; for(register int i = 1; i <= n; i++) for(register int j = 1; j <= n; j++) { int l = max(j - a[j] , 1) , r = min(j + a[j] , n); if (l <= i && i <= r) f[i] = min(f[i] , f[l - 1] + 1); } printf("%d" , f[n]); }
而我们发现在转移时, 的要取所有满足条件的线段的 的最小值
而要满足的条件就是
于是我们用线段树维护
逆着考虑,维护每个 能影响的范围
#include<cstdio> #include<iostream> #include<cstring> #define ls (k << 1) #define rs (ls | 1) using namespace std; const int N = 5e5 + 5 , INF = 0x3f3f3f3f; int n , f[N] , nxt[N] , seg[N * 4] , tag[N * 4]; struct node{ int l , r; }a[N]; void pushdown(int k) { if (tag[k] == INF) return; seg[ls] = min(seg[ls] , tag[k]) , tag[ls] = min(tag[ls] , tag[k]); seg[rs] = min(seg[rs] , tag[k]) , tag[rs] = min(tag[rs] , tag[k]); tag[k] = INF; } void update(int l , int r , int k , int tl , int tr , int v) { if (tl <= l && r <= tr) { seg[k] = min(seg[k] , v) , tag[k] = min(tag[k] , v); return; } pushdown(k); int mid = (l + r) >> 1; if (tl <= mid) update(l , mid , ls , tl , tr , v); if (tr > mid) update(mid + 1 , r , rs , tl , tr , v); seg[k] = min(seg[ls] , seg[rs]); } int query(int l , int r , int k , int x) { if (l == r && l == x) return seg[k]; pushdown(k); int mid = (l + r) >> 1; if (x <= mid) return query(l , mid , ls , x); if (x > mid) return query(mid + 1 , r , rs , x); } int main() { scanf("%d" , &n); int x; for(register int i = 1; i <= n; i++) { scanf("%d" , &x); a[i].l = max(i - x , 1) , a[i].r = min(i + x , n); if (a[nxt[a[i].l - 1]].r < a[i].r) nxt[a[i].l - 1] = i; } memset(seg , 0x3f3f3f3f , sizeof seg) , memset(tag , 0x3f3f3f3f , sizeof tag); if (nxt[0] != 0) update(1 , n , 1 , a[nxt[0]].l , a[nxt[0]].r , 0); for(register int i = 1; i <= n; i++) { f[i] = query(1 , n , 1 , i) + 1; if (nxt[i] != 0) update(1 , n , 1 , a[nxt[i]].l , a[nxt[i]].r , f[i]); } printf("%d" , f[n]); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具