题目

实际上经转换得:

给了 \(n(n \le 5 \times 10^5)\) 条线段,求覆盖 \([1..n]\) 需要的最少条数

分析

设 \(f_i\) 表示覆盖了 \([1..n]\) 时需要的最少的线段数

那么 \(O(n^2)\) 的转移是这样的

#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]);
}

而我们发现在转移时,\(f_i\) 的要取所有满足条件的线段的 \(f_{l-1}\) 的最小值

而要满足的条件就是 \(l \leq i \leq r\)

于是我们用线段树维护

逆着考虑,维护每个 \(f_i\) 能影响的范围

#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]);
}

JZOJ 捕老鼠的更多相关文章

  1. JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠

    JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...

  2. JZOJ5431 捕老鼠

    JZOJ 5341 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕老鼠. 猫虽然擅长捕老鼠,但是老鼠们太健美了 ...

  3. jzoj5341 捕老鼠

    Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕老鼠. 猫虽然擅长捕老鼠,但是老鼠们太健美了,身手敏捷,于是猫想 ...

  4. 8.14-T2捕老鼠(cat)

    题目大意 有 N 个仓库,排成了一排,编号为 1-N.假设在第 i 个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai的距离,接着所有|i-j|<=Ai的仓库 j 的老鼠被消灭.最少需要多少支 ...

  5. JavaScript学习总结(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  6. 为shell布置陷阱:trap捕捉信号方法论

    本文目录: 1.1 信号说明 1.2 trap布置陷阱 1.3 布置完美陷阱必备知识 家里有老鼠,快消灭它!哎,又给跑了.老鼠这小东西跑那么快,想直接直接消灭它还真不那么容易.于是,老鼠药.老鼠夹子或 ...

  7. JavaScript学习总结(四)——this、原型链、javascript面向对象

    一.this 在JavaScript中this表示:谁调用当前函数this就指向谁,不知道调用者时this指向window. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是 ...

  8. PTA编程总结3—抓老鼠啊~亏了还是赚了?

    题目: 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕鼠夹 ...

  9. 2019寒假作业三:PTA7-1抓老鼠啊~亏了还是赚了

    - 抓老鼠啊~亏了还是赚了? ( 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C ...

  10. 面试习题之设计模式 C#观察者模式(猫叫老鼠惊走主人醒)

    腾讯云测试|TEST Tencent Cloud /* * CatShout.cs */ using System; using System.IO; using System.Collections ...

随机推荐

  1. 2A锂电池充电管理IC,具有恒压/恒流充电模式

    PW4052 是一颗适用于单节锂电池的.具有恒压/恒流充电模式的充电管理 IC.该芯片采用开关型的工作模 式, 能够为单节锂电池提供快速. 高效且简单的充电管理解决方案. PW4052 采用三段式充电 ...

  2. C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用

    关于进程 之前我在启动我的师生对讲的exe的时候,都是直接调用Process类的静态函数Process.Start(System.String AppPath,System.String Argume ...

  3. STM32与PS2的无线通信和相关函数介绍

    PS2采用SPI通信协议 源码和参考文件获取:https://github.com/Sound-Sleep/PS2_Based_On_STM32 接收器接口 DI:手柄->主机,时钟的下降沿传送 ...

  4. 2022年7月15日,第四组,周鹏,JAVA认识的第三天,算法的第一天(╥╯^╰╥)(╥╯^╰╥)

    算了,已经没有力气去创作些什么了, 8种排序方法我只会4种,剩下的以后再补. 发一个逻辑题吧: 一个村落,有50户人,在这些人中存在着n个红眼病. 在保证每人每天最少见一面的情况下,有如下规则: 1, ...

  5. Redis学习整理

    目录 1.Redis基本概念 2.Redis的5种基本类型 3.Jedis整合redis操作 4.Springboot整合redis 5.Redis主从复制 5.1.概念 5.2.原理 6.开启主从复 ...

  6. Hadoop生态元数据管理平台——Atlas2.3.0发布!

    大家好,我是独孤风. 今天我们来聊一下另一个元数据管理平台Apache Atlas.Atlas其实有一些年头了,是在2015年的时候就开源. 相对于Datahub来说,Atlas显得有一些" ...

  7. 从最简单的线性DP开始

    导读 ^ _ ^ 线性DP可以说是最常见的DP问题. 从本期开始,我们将从最简单的线性DP开始学起. 后面同时更新一些经典的面试题带大家更加深入的学习线性DP 如何计算动态规划的时间复杂度? 状态数 ...

  8. Spring 和 Spring MVC的区别

    Spring 和 Spring MVC的区别   学习Spring MVC也有几天时间了,那么Spring和Spring MVC的区别到底在哪里,二者是什么关系呢?认为二者是一个东西那肯定是不对的,而 ...

  9. [NOIP2017 普及组]跳房子 【题解】

    题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 \(n ...

  10. 分布式拒绝服务攻击(DDoS)和僵尸网络(Botnet)

    DDos和僵尸网络是相辅相成的两种攻击手段,本文仅介绍基本概念,详细请查看文末参考资料. 分布式拒绝服务攻击(DDoS) 分布式拒绝服务攻击DDoS是一种基于DoS的特殊形式的拒绝服务攻击,是一种分布 ...