P2251 质量检测

正解应该是ST表和单调队列,不过对于这道题来说只有查询没有修改,这里我还是想用线段树和分块来写,不得不说分块是真好,优雅的暴力

线段树版本

#include <bits/stdc++.h>
#define LL long long
using namespace std; const int N = 1e6 + 10; struct SegmentTree{
int l, r;
int minn;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define minn(x) tree[x].minn
}tree[4 * N];
int n, m, a[N]; void build(int p, int l, int r)
{
l(p) = l, r(p) = r;
if(l == r) {minn(p) = a[l]; return;}
int mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
minn(p) = min(minn(p << 1), minn(p << 1 | 1));
} int ask(int p, int l, int r)
{
if(l <= l(p) && r >= r(p)) return minn(p);
int mid = (l(p) + r(p)) >> 1;
int val = 1e9;
if(l <= mid) val = min(ask(p << 1, l , r), val);
if(r > mid) val = min(ask(p << 1 | 1, l, r), val);
return val;
} void solve()
{ cin >> n >> m;
for(int i = 1; i <= n; ++ i) cin >> a[i];
build(1, 1, n); for(int i = 1; i + m - 1 <= n; ++ i) cout << ask(1, i, i + m - 1) << endl;
} int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
// freopen("1.in", "r", stdin);
solve();
return 0;
}

分块版本

#include <bits/stdc++.h>
#define LL long long
using namespace std; const int N = 1e6 + 10;
int a[N], n, m, block[N], ans[N], bl; int ask(int l, int r)
{
int p = block[l], q = block[r], res = 1e9;
if(p == q) for(int i = p; i <= q; ++ i) res = min(res, a[i]);
else
{
for(int i = p + 1; i <= q - 1; ++ i) res = min(res, ans[i]);
for(int i = l; i <= p * bl; ++ i) res = min(res, a[i]);
for(int i = (q - 1) * bl + 1; i <= r; ++ i) res = min(res, a[i]);
}
return res;
} void solve()
{
cin >> n >> m;
for(int i = 1; i <= n; ++ i) cin >> a[i];
bl = sqrt(n);
memset(ans, 0x3f, sizeof ans);
for(int i = 1; i <= n; ++ i)
{
block[i] = (i - 1) / bl + 1;
ans[block[i]] = min(ans[block[i]], a[i]);
}
for(int i = 1; i + m - 1 <= n; ++ i) cout << ask(i, i + m - 1) << endl;
} int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
// freopen("1.in", "r", stdin);
solve();
return 0;
}

P2251 质量检测(分块线段树RMQ单调队列)的更多相关文章

  1. PKU 2823 Sliding Window(线段树||RMQ||单调队列)

    题目大意:原题链接(定长区间求最值) 给定长为n的数组,求出每k个数之间的最小/大值. 解法一:线段树 segtree节点存储区间的最小/大值 Query_min(int p,int l,int r, ...

  2. ACM学习历程—HDU 5289 Assignment(线段树 || RMQ || 单调队列)

    Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...

  3. bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列

    详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...

  4. 1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP

    1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在 ...

  5. POJ 2823 线段树 Or 单调队列

    时限12s! 所以我用了线段树的黑暗做法,其实正解是用单调队列来做的. //By SiriusRen #include <cstdio> #include <cstring> ...

  6. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】

    题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...

  7. Luogu4085 [USACO17DEC]Haybale Feast (线段树,单调队列)

    \(10^18\)是要long long的. \(nlogn\)单调队列上维护\(logn\)线段树. #include <iostream> #include <cstdio> ...

  8. HDU 1754 I Hate It 线段树RMQ

    I Hate It Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=175 ...

  9. 《白书》上线段树RMQ的实现

    白书上的线段树RMQ实现,自己重写了一遍: #include <bits/stdc++.h> using namespace std; const int MAXN=1<<17 ...

  10. [HNOI/AHOI2018]转盘(线段树优化单调)

    gugu  bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...

随机推荐

  1. go中异常处理流程

    在 Go 语言中,panic.recover 和 defer 是用于处理异常情况的关键字.它们通常一起使用来实现对程序错误的处理和恢复. 1. defer 语句 defer 用于在函数返回之前执行一段 ...

  2. TienChin-课程管理-展示课程列表

    配置按钮权限 博主这里就不贴SQL了,自行手动添加一下吧. 更改表结构 ALTER TABLE `tienchin_course` MODIFY COLUMN `info` varchar(255) ...

  3. RestTemplate-postForObject详解、调用Https接口、源码解析,读懂这一篇文章就够了

    restTemplate 目录 restTemplate 1. 基本介绍 2. 常用方法分析及举例 2.1. get请求 2.2. post请求 3. springboot中使用restTemplat ...

  4. 2.3 Windows驱动开发:内核字符串转换方法

    在内核编程中字符串有两种格式ANSI_STRING与UNICODE_STRING,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下ANSI_STRING代表的类型是ch ...

  5. Vue3用户代码片段

    1.defineComponent语法 { "Print to console": { "prefix": "vue3", "bo ...

  6. Gin 获取请求参数

    1.获取URL?后的参数(不区分请求方式) // 获取请求url ? 后的参数(url:8080/add?name=kelvin) func GetUrlParam(ctx *gin.Context) ...

  7. 该换Linux版本了!

    提起开发,程序员们更青睐于不同版本的Linux操作系统而不是Windows.为什么?因为Linux操作起来更安全.快捷,最重要的是,它的发行版本众多.你可以根据需要挑选最适合的那一款.那么,问题来了, ...

  8. (C语言)每日代码||2023.12.27||关于(++i)+(++i)以及(++i)+(i = 100)

    #include <stdio.h> int main() { int i = 1; int a = (++i) + (++i); printf("a = %d,i = %d\n ...

  9. setjmp/longjmp使用问题

    setjmp/longjmp开启编译优化后导致出现无法正常使用

  10. 多线程系列(二) -Thread类使用详解

    一.简介 在之前的文章中,我们简单的介绍了线程诞生的意义和基本概念,采用多线程的编程方式,能充分利用 CPU 资源,显著的提升程序的执行效率. 其中java.lang.Thread是 Java 实现多 ...