题目

实际上经转换得:

给了 \(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. linux配置 python 开发环境sublime text及一些使用心得

    前言 一直以来我都使用 sublime text 作为主流开发的 ide ,但其实我开始在我的 linux mint 系统使用 sublime text 配置 python3 的开发环境踩过的坑又何止 ...

  2. Oracle 一对多将多行数据整理为一行

    在开发中一对多的关系经常用到,昨天遇到一个客户问题,要求将所有反馈任务的信息整理为一行展示并导出excel. 我数据库对应关系:通任务task对应feedback表多个反馈,也就是说每个任务都有很多条 ...

  3. 【接口测试】Postman(一)--接口测试知识准备

    1.0 前言 ​ 应用程序编程接口(Application Programming Interface, API)是这些年来最流行的技术之一,强大的Web应用程序和领先的移动应用程序都离不开后端强大的 ...

  4. git、docker、lunix、python、pycharm等常用命令整理

    git的使用 上传代码git clone ....git branch new_branchgit checkout branch_namegit add .git commit -m "& ...

  5. 你的项目使用Optional了吗?

    1.基本概念 java.util.Optional<T>类本质上就是一个容器,该容器的数值可以是空代表一个值不存在,也可以是非空代表一个值存在. 2.获取对象 2.1 相关方法 2.2 案 ...

  6. Spring IOC源码(二):IOC容器之 刷新前的准备

    1.源码解析 prepareRefresh()容器刷新refresh()的第一个方法,是容器刷新前的准备工作. 1 // 容器启动的开始时间 毫秒级 2 private long startupDat ...

  7. STM32用PWM波控制呼吸灯代码

    pwm.c #include "pwm.h" //TIM3-CH3 //PB0 void PWM_Config(void) { GPIO_InitTypeDef GPIO_Init ...

  8. 搭建漏洞环境及实战——搭建SQL注入平台

    Sqli-lab是一款学习SQL注入的开源平台,共有75种不同类型的注入,复制源码然后将其粘贴到网站的目录中,进入MySQL管理中的PHPMyAdmin,打开http://127.0.0.1/phpM ...

  9. 【Vue】启动vue项目报错: errno: -4058, code: ‘ENOENT‘, syscall: ‘spawn cmd‘

    运行vue项目(npm run dev)报错 报错如下 问题原因 缺少cmd运行程序的环境变量 解决方法在环境变量Path中加上C:\windows\system32

  10. python 爬虫可视化,天气

    网站地址='https://lishi.tianqi.com/chengdu/201704' import matplotlib.pyplot as plt import requests from ...