`
digiter
  • 浏览: 120709 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RMQ模板

    博客分类:
  • ICPC
阅读更多
/*
 * Author: rush
 * Created Time:  2010年07月28日 星期三 09时29分05秒
 * File Name: icpc/hdu3486.cpp
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#define out(v) cout << #v << ": " << (v) << endl
using namespace std;
typedef long long LL;

const int maxn = 200000 + 5;
int n, k, a[maxn];
int rmax[20][maxn];
void make()
{
	for (int j = 0; j < n; ++j)
		rmax[0][j] = a[j];
	for (int i = 0; i + 1 < 20; ++i)
		for (int j = 0; j + (1 << i) < n; ++j)
			rmax[i + 1][j] = max(rmax[i][j], rmax[i][j + (1 << i)]);
}
// [begin, end)
int query(int begin, int end)
{
	int k = 0;
	while ((1 << (k + 1)) < end - begin) ++k;
	return max(rmax[k][begin], rmax[k][end - (1 << k)]);
}

int main()
{
	while (scanf("%d%d", &n, &k) != EOF)
	{
		if (n < 0 && k < 0) break;
		for (int i = 0; i < n; ++i)
			scanf("%d", &a[i]);
		make();
		int m, L, prev = -1, sum, i, j;
		for (m = 1; m <= n; ++m)
		{
			L = n / m;
			if (L != prev) 
				sum = 0, i = 0, j = 0;
			while (i + L <= n && j < m)
			{
				sum += query(i, i + L);
				i += L;
				++j;
			}
			prev = L;
			if (sum > k) break;
		}
		printf("%d\n", m <= n ? m : -1);
	}
    return 0;
}


update 20101230:
二维RMQ
/*
 * Author: rush
 * Created Time:  2010年12月30日 星期四 15时59分14秒
 * File Name: icpc/pku2019_2.cpp
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#define out(v) cout << #v << ": " << (v) << endl
#define FOR(i, n) for (int i = 0; i < n; ++i)
#define two(x) (1 << x)
#define min4(a, b, c, d) min(min(min(a, b), c), d)
#define max4(a, b, c, d) max(max(max(a, b), c), d)
using namespace std;
typedef long long LL;

int N, B, K;
int mat[255][255];

int rmin[10][255][255], rmax[10][255][255];
void make() {
	FOR(i, N) FOR(j, N) rmin[0][i][j] = rmax[0][i][j] = mat[i][j];
	for (int k = 0; k + 1 < 10; ++k)
		for (int i = 0; i + two(k) < N; ++i)
			for (int j = 0; j + two(k) < N; ++j) {
				rmin[k + 1][i][j] = min4(rmin[k][i][j], rmin[k][i][j + two(k)], rmin[k][i + two(k)][j], rmin[k][i + two(k)][j + two(k)]);
				rmax[k + 1][i][j] = max4(rmax[k][i][j], rmax[k][i][j + two(k)], rmax[k][i + two(k)][j], rmax[k][i + two(k)][j + two(k)]);
			}
}
int query(int x, int y) {
	int k = 0;
	while (two(k + 1) <= B) ++k;
	int tmin = min4(rmin[k][x][y], rmin[k][x][y + B - two(k)], rmin[k][x + B - two(k)][y], rmin[k][x + B - two(k)][y + B - two(k)]);
	int tmax = max4(rmax[k][x][y], rmax[k][x][y + B - two(k)], rmax[k][x + B - two(k)][y], rmax[k][x + B - two(k)][y + B - two(k)]);
	return tmax - tmin;
}
int main()
{
	scanf("%d%d%d", &N, &B, &K);
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			scanf("%d", &mat[i][j]);
	make();
	while (K--) {
		int x, y;
		scanf("%d%d", &x, &y);
		--x, --y;
		printf("%d\n", query(x, y));
	}
    return 0;
}
分享到:
评论

相关推荐

    算法模板1

    【RMQ模板11】:RMQ(Range Minimum Query)是在一个数组中寻找给定范围内的最小值的问题。模板通常提供了高效的数据结构或算法来快速回答这类查询,如使用STL的`std::vector`或自定义的数据结构。 【马拉车算法...

    rmq-promotion-template:使用ProMotion的基本RubyMotionQuery模板的版本

    该模板基于默认的RMQ模板。 实际上,它是相同的模板应用程序,但有以下更改: /controllers/main_controller.rb已经移动到/screens/main_screen.rb与推广惯例保持一致 使用ProMotion助手方法创建导航栏 安装及使用...

    ACM巨全模板 .pdf

    3.线段树模板(模板为区间加法) (线段树染色) (区间最小值) 4.线性基 (求异或第k大) 5.主席树(静态求区间第k小) (区间中小于k的数量和小于k的总和) (区间中第一个大于或等于k的值) 6.权值线段树 (求逆序对) 7.动态...

    ACM图论模板合集.pdf

    图论--LCA--在线RMQ ST 最小环: 图论--最小环--Floyd模板 树的直径: 图论--树的直径--DFS+树形DP模板 树的重心: 图论--树的重心(DFS) 模板 生成树: 图论--最小生成树--Kruscal 模板 ...

    ACM/ICPC模板

    --RMQ --改点堆优化的dijkstra算法 --快速付利叶变换 --稳定婚姻问题 --SPFA(最短路快速算法) // thanks to love8909 几何相关 --初等几何学 --多边形几何 --几种凸包算法 --半平面交算法 --旋转卡壳算法 数据结构...

    ACM-ICPC算法模板1

    ACM-ICPC算法模板1是一种常用的竞赛编程算法模板,涵盖了图论、并查集、最小生成树、Kruskal、堆优化、Prim、Dijkstra、最近公共祖先、RMQ-ST、强连通分量树链剖分等多种算法和数据结构。以下是该模板的详细知识点...

    组合查询模板

    "组合查询模板"就是一个针对这种情况设计的工具,它利用PowerBuilder(PB)这一强大的可视化开发环境,实现了多条件组合查询的功能。下面我们将深入探讨这个主题。 PowerBuilder(PB)是一款面向对象的快速应用开发...

    acm模板(全)

    5.1.5 An(N), O(1)&gt; algorithm for the restricted RMQ 60 5.1.6 An AC programme 61 5.2 最长公共子序列LCS 64 5.3 最长上升子序列/最长不下降子序列(LIS) 65 5.3.1 O(n^2) 65 5.3.2 O(nlogn) 66 5.4 Joseph问题 67...

    ACM 算法 常用模板

    ### ACM算法常用模板详解 #### 图论部分:Tarjan算法LCA **知识点解析:** 在ACM竞赛中,寻找二叉树中的最近公共祖先(Least Common Ancestor, LCA)是一个非常重要的问题。其中,Tarjan算法是一种高效且通用的...

    算法文档无代码RMQ&LCA问题

    算法文档无代码RMQ&LCA问题提取方式是百度网盘分享地址

    ACM 算法模板集

    ACM 算法模板集 Contents 一. 常用函数与STL 二. 重要公式与定理 1. Fibonacci Number 2. Lucas Number 3. Catalan Number 4. Stirling Number(Second Kind) 5. Bell Number 6. Stirling's Approximation 7. Sum of ...

    wata ACM 模板 v0.9

    标题“wata ACM 模板 v0.9”中的“wata”可能是一个编写该模板的团队或个人的名称,而“模板 v0.9”则表示这是该模板的第0.9版本,表明它可能是一个尚在完善中的工作版本。 在描述中提到“wata模板,著名ACM备战...

    C++一些提高+的模板

    包括树剖,线段树,splay,Treap,网络流,RMQ,数论函数求值,主席树,树状数组,LCA,CRT,BSGS,树套树等模板。(注:其中的两个cdq模板都没用的,整体二分写错了,其余模板可以自行测试。 p.s.有些可能与一些已...

    常用数据结构 - C语言实现

    NOTONLLY的SBT模板.cpp NOTONLLY的划分树模板.cpp NOTONLLY的后缀数组模板.cpp RMQ-ST算法.cpp RMQ线段树.cpp SBT.cpp SBT2.cpp splay伸展树.cpp ST表.cpp Treap.cpp Trie树.cpp 二叉堆.cpp 二维线段树.cpp 后缀数组...

    ACM_算法模板集史上最完整收藏版223页pdf

    - 动态规划(DP)、0/1背包问题(0/1-Knapsack)、区间动态规划(RMQ-ST)、后缀数组(LCP-RMQ-ST)。 - 最长公共子序列(LCS)。 - 这些算法在解决多阶段决策问题时非常有效,如资源分配、序列对比等。 5. 字符串处理算法: ...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    8.6 LCA和RMQ 167 8.7 割和桥 171 8.8 最小生成树(kruskal) 172 8.9 最短路径 173 8.10 最大网络流 175 8.11 最小费用流 180 8.12 最大团问题 182 8.13 二分图匹配 184 8.14 带权的最优二分图匹配 184 9.搜索算法...

    ACM图论模板_BY夏天的风

    LCA与RMQ(最近公共祖先和区间查询):LCA用于求解树上任意两点的最近公共祖先,而RMQ是解决在一个区间内寻找最小值的问题。 最短路算法:包括Dijkstra、SPFA、Floyd等,这些算法用于求解单源最短路径、多源最短...

    ACM模板代码库

    - RMQ(Range Minimum/Maximum Query)问题的不同解决算法。 - LCA(Lowest Common Ancestor)问题的离线算法。 - 带权值的并查集。 - 快速排序、堆栈、区间最大频率。 - 归并排序、二分查找以及各种字符串处理算法...

    NOIP模板4_NOIP_

    这个模板可能包含计算二叉树或树中任意两个节点最近公共祖先的算法,如Mo's Algorithm或基于RMQ(Range Minimum Query)的数据结构。 3. **KMP.cpp**:KMP算法是一种字符串匹配算法,用于在一个文本串中查找一个...

Global site tag (gtag.js) - Google Analytics