首页 > 其他分享 >初识st表-P2880

初识st表-P2880

时间:2024-02-17 20:56:56浏览次数:39  
标签:log int 初识 st P2880 include 21

首先讲讲 st 表。这个东西呢,就是一种利用了倍增思想的预处理数据从而达到快速查询的功能。

    for (int i = 1;i <= n; ++ i)
        scanf ("%d", &f[i][0]);
    for (int i = 1;i < 21; ++ i) {
        int t1 = 1 << i - 1, t2;
        t2 = t1 << 1;
        for (int j = 1;j + t2 <= n + 1; ++ j)
            f[j][i] = min(f[j][i - 1], f[i + t1][i - 1]);
    }

文中我们使用 $f_{i,j}$ 来表示从 i 开始向后 $2^j$ 个位置中的 f 值(以最小值为例)。

令 $k = log_2(r-l+1)$,则min(f[l][k], f[r - (1 << k) + 1][k])即为 $[l,r]$ 范围内的最小值。

那么接下来要讲讲局限性。

这样求值非常的方便,但是呢 $[l,l+2^k-1]$ 与 $[r - (1 << k) + 1,r]$ 会产生交集,所以用这样的 st 表存的东西必须可重复贡献,例如最大最小值,最大公约数,最小公倍数,位或,位与等等,这样便可以对两个交集不为空的区间进行合并了,还要符合结合率哦。

板题 P2880

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 5e4 + 5;
int minn[N][21], maxn[N][21];
int n, q;
int main() {
    scanf ("%d%d", &n, &q);
    for (int i = 1;i <= n; ++ i) {
        scanf ("%d", &minn[i][0]);
        maxn[i][0] = minn[i][0];
    }
    for (int i = 1;i < 21; ++ i) {
        int t1 = 1 << i - 1, t2;
        t2 = t1 << 1;
        for (int j = 1, k = t1 + 1;j + t2 <= n + 1; ++ j, ++ k) {
            minn[j][i] = min(minn[j][i - 1], minn[k][i - 1]);
            maxn[j][i] = max(maxn[j][i - 1], maxn[k][i - 1]);
        }
    }
    while (q --) {
        int l, r;
        scanf ("%d%d", &l, &r);
        int k = log2(r - l + 1);
        printf ("%d\n", max(maxn[l][k], maxn[r - (1 << k) + 1][k]) - min(minn[l][k], minn[r - (1 << k) + 1][k]));
    }
    
    return 0;
}

P.S. 取 log 也需要时间,所以 log 值可以预处理出来。

for (int i = 2;i <= n; ++ i)
	log[i] = log[i >> 1] + 1;

标签:log,int,初识,st,P2880,include,21
From: https://www.cnblogs.com/Assassins-Creed/p/18018373

相关文章

  • 100 行代码实现用户登录注册与 RESTful 接口 - 手把手教程附 Python 源码
    在开发大多数应用时,用户系统都是必不可少的部分,而我们总是需要开发围绕用户的登录,注册,获取,更新等接口。在这篇文章将带你用一百多行代码简洁地实现一套这样的用户鉴权与RESTful接口,并使用Session来处理用户的登录登出我们将使用UtilMeta框架完成接口开发,这是一个开源的Py......
  • [ARC165C] Social Distance on Graph
    转化题意,对图进行黑白染色,求最大的\(X\)满足所有\(u,v\)间最短路径小于\(X\)的\(u,v\)异色。很明显是二分答案,假设现在二分到\(mid\),转化为判定型问题。直接\(n^2\)枚举点肯定不对。发现性质:如果\(u,v\)的最短路径长度小于\(X\)且最短路径上经过的边数大于\(......
  • 第二十三天:MYSQL集群Cluster
    一、MySQL主从复制 1、主从复制架构和原理读写分离复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制2、复制架构(1)一主一从复制架构 (2)一主多从复制架构3、主从复制原理  主从复制相关线程主节点:dumpThread:为每个Slave的I/OThread启动一个dump线......
  • [ARC067F] Yakiniku Restaurants
    首先考虑暴力。\(\mathcalO(n^2m)\)枚举左右两个端点,再贪心地选其中\(M\)张票的美味度最大那一家餐馆。复杂度不可接受,但是不难感觉到正解应该是\(\mathcalO(n^2)\)的。考虑枚举左端点\(i\),对于当前左端点,记每一个右端点\(j\)的答案为\(now_j\),若暂时不考虑距离,大部分......
  • Angular 17+ 高级教程 – Prettier, ESLint, Stylelint
    前言不熟悉 Prettier,ESLint,Stylelint的朋友可以先看这篇 工具–Prettier、ESLint、Stylelint。本篇主要是教如何在Angular项目引入 Prettier、ESLint、Stylelint。 ESLint       目录上一篇 TODO下一篇TODO想查看目录,请移步 Angular17+高......
  • Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按
    需求  使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图。  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题。  实际预期效果为:   原因  QCustomPlot加入数据是按照x轴排列,也可以按照y轴排列,使用图层......
  • CF1540E Tasty Dishes
    Description初始有\(n\)个数\(a_i\),以及若干条有向边\((u_i,v_i)\),保证\(u_i<v_i\)。一轮操作会形如下面两个过程:首先\(\foralli,a_i:=\max(a_i,ia_i)\)。然后\(\foralli,a'_i:=a_i+\sum\limits_{(i,j)\inE}\max(a_j,0)\),最后\(\foralli,a_i:=a'_i\)。......
  • PostgreSQL
    PostgreSQL安装后Navicat连不上报错Theauthenticationtype10isnotsupported.Checkthatyouhaveconfiguredthesys_hba.conf解决方案:找到启动数据库的data目录vim打开sys_hba.conf文件,把METHDD列全部改成trust执行结果:在vim命令模式下输入%s/替换的内容/要替换的内容/回......
  • Unity Audio System概要
    Unity的AudioSystem给我们提供了一整套的游戏音频处理解决方案,接下来我们对UnityAudioSystem进行简单的讲解。首先让我们来了解一下UnityAudioSystem包含了哪些重要的组成部分。AudioClip:这个是Unity存放外部音频资源的容器,可以根据我们的需要将外部导入的音频资源进行粗处......
  • kubernetes对接kadalu使用GlusterFS作为存储
    1.安装glusterfsgluster官网:https://www.gluster.org部署参考:https://cloud-atlas.readthedocs.io/zh-cn/latest/kubernetes/storage/k8s_gluster.html前期需要准备3个节点作为glusterfs集群slave,并且每个节点至少需要个提供1块磁盘。节点名称ip地址磁盘k8s-master0......