感染(low)bfs 、感染(mid) 二分、感染(high) 二分 + 维护单调 队列去除无用的点
感染(low) Description
n户人家住在一条直线上,从左往右依次编号为1,2,…,n。起初,有m户人家感染了COVID-19,而接下来的每天感染的人家都会感染他家左右两家的人,问t天后总共有多少人家会感染。
Input 第一行输入三个整数n(1 <= n <= 2e5),m(0 <= m <= n),t(1<= t <= 2e5)。
第二行m个整数ai(1 <= ai <= n),代表最初感染的m户人家的编号。
Output 输出一个整数,代表最后会有多少人家感染。
思路
用 bfs 搜一遍
代码
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
const int Len = 2e5 + 5;
int n,m,t;
int map[Len];
int pos[Len];
int mov[2] = {-1, 1};
int mark[Len];
struct Node
{
int x,t;
} st, ed;
queue<Node> q;
void bfs()
{
//初始化、做标记、压队列
while(! q.empty())
{
st = q.front();
q.pop();
if(st.t > t)
continue;
for(int i = 0; i < 2; i ++)
{
ed.x = st.x + mov[i];
ed.t = st.t + 1;
if(ed.x >= 1 && ed.x <= n && ! mark[ed.x] && ed.t <= t)
{
q.push(ed);
mark[ed.x] = 1;
}
}
}
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
//freopen("T.txt","r",stdin);
cin >> n >> m >> t;
for(int i = 1; i <= m; i ++)
{
cin >> pos[i];
mark[pos[i]] = 1;
q.push( (Node){ pos[i], 0});
}
bfs();
int cnt = 0;
for(int i = 1; i <= n; i ++)
if(mark[i])
cnt ++;
cout << cnt << endl;
return 0;
}
Sample Input 1
10 3 2
1 3 4
Sample Output 1
6

思路
用 二分
代码
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
const int Len = 1e6 + 5;
long long sum[Len];
int n,q;
int Binary_search(int k, int l, int r)
{
int mid;
int ans = 1e9;
while(l <= r)
{
mid = (l + r) / 2;
if(sum[mid] < k)
{
l = mid + 1;
}
else if(sum[mid] >= k)
{
r = mid - 1;
ans = min(ans, mid);
}
}
return ans ;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
//freopen("T.txt","r",stdin);
cin >> n >> q;
for(int i = 1; i <= n; i ++)
{
cin >> sum[i];
sum[i] += sum[i - 1];
}
int x;
while(q --)
{
cin >> x;
cout << Binary_search(x, 1, n) <<endl;
}
return 0;
}

思路
二分 + 维护单调队列 优化
代码
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int Len = 1e6 + 5;
ll ar[Len];
ll br[Len];
ll sum[Len];
ll q[Len];
int id[Len];
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
//freopen("T.txt","r",stdin);
int n,m;
cin >> n >> m;
for(int i = 1; i <= n; i ++)
cin >> ar[i];
for(int i = 1; i <= n; i ++)
cin >> br[i];
for(int i = 1; i <= n; i ++)
sum[i] = ar[i] - br[i] + sum[i - 1];
int cnt = 0;
q[++ cnt] = 0;
id[cnt] = 1;
for(int i = 1; i <= n; i ++)
if(sum[i] > q[cnt])
{
q[++cnt] = sum[i];
id[cnt] = i;
}
int tem;
while(m --)
{
cin >> tem;
cout << id[lower_bound(q + 1, q + 1 + cnt, tem) - q] << endl;
}
return 0;
}
感染(low)bfs 、感染(mid) 二分、感染(high) 二分 + 维护单调 队列去除无用的点的更多相关文章
- 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)
[BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...
- hdu 5289 rmp+二分+枚举后界 or单调队列 ****
好题~~ 给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数,枚举后界~~ 又是一种没见过的方法,太弱了/(ㄒoㄒ)/~~ #include <cstdio ...
- [USACO12MAR]花盆 二分 单调队列
[USACO12MAR]花盆 二分 单调队列 存在一个长度为\(x\)的区间\([l,r]\),使得区间中最大值与最小值差至少为\(w\),求这个最小的\(x\) \(n\le 100000\),\( ...
- luogu P3657 (NOIP2017) 跳房子(二分+DP+单调队列)
题面 传送门 分析 显然答案有单调性,可以二分答案,设当前二分值为g,根据题意我们可以求出跳跃长度的范围[l,r] 考虑DP 子状态: dp[i]表示跳到第i个点时的最大和 状态转移方程 \(dp[i ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- hdu_5884_Sort(二分+单调队列)
题目链接:hdu_5884_Sort 题意: 有n个数,每个数有个值,现在你可以选择每次K个数合并,合并的消耗为这K个数的权值和,问在合并为只有1个数的时候,总消耗不超过T的情况下,最小的K是多少 题 ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
2806: [Ctsc2012]Cheat 题意: 多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的 如果熟悉的字符串长度>=询问串 ...
- BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列
BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列 题意: 分析: 拆成链,二分答案,奇偶两个单调队列维护最大子段和,记录方案. 代码: #include <cstdio&g ...
随机推荐
- frp 内网穿透访问内网Web服务
ps:最近想要通过域名(公网)访问或者测试在本地搭建的 web 服务(不想在公网IP服务器上再部署个服务,也不想通过teamview等工具远程卡到爆!), 由于本地机器没有公网 IP,无法将域名解析到 ...
- 单片机基础——使用GPIO输出点亮一个LED灯
1. 准备工作 硬件准备 开发板首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...
- windows上用putty从linux上下载文件
我之前使用putty都是直接从网上下的putty.exe,其实如果想下载windows的mis二进制文件,系统安装的话会包含,pscp.psftp.puttygen等一系列的文件. 今天下从服务器上, ...
- Canny检测算法与实现
1.原理 图象边缘就是图像颜色快速变化的位置,对于灰度图像来说,也就是灰度值有明显变化的位置.图像边缘信息主要集中在高频段,图像锐化或检测边缘实质就是高通滤波.数值微分可以求变化率,在图像上离散值求梯 ...
- ES6: let 与 const
ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const. let 声明的变量只在 let 命令所在的代码块内有效. const 声明一个只读的常量,一旦声明 ...
- ASP.NET MVC5实现芒果分销后台管理系统(一):系统结构设计,集成AutoMapper,Log4net
在构思完系统思维脑图后,小墨回到家中,便摩拳擦掌开始了开发工作.要想迅速完成系统开发,前期系统设计和准备尤其重要,因为小墨做过太多大大小小的业务系统,准备工作也是十分顺利. 系统结构 整个系统工程结构 ...
- Java-字符流练习。(新手)
参考手册: 关键字: write() 写入存取 close() 结束 flush() 刷新缓冲区(缓冲区就是临时存放数据的区域.) currentTimeMillis() 返回以毫秒为 ...
- kerberos系列之hdfs&yarn认证配置
一.安装hadoop 1.解压安装包重命名安装目录 [root@cluster2_host1 data]# tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local/ [ ...
- Android RadioGroup+Fragment 底部导航
- 升级Kubernetes 1.18前,你不得不知的9件事
本文来自Rancher Labs 昨天Kubernetes最新版本v1.18已经发布,其包含了38项功能增强,其中15项为稳定版功能.11项beta版功能以及12项alpha版功能.在本文中,我们将探 ...