MT3049 区间按位与(ST表)

2024-06-05 14:28
文章标签 mt3049 按位 st 区间

本文主要是介绍MT3049 区间按位与(ST表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MT3049 区间按位与(ST表)

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

这里先说一下我首先想到的思路,对区间进行操作,又是区间查询,所以我首先想到了线段树,于是一段回忆猛敲(copy),结果线段树是能做,但是数据量大了之后会TTL。。。

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;const int MAXN=2e5+2;#define LL(x) (x<<1)
#define RR(x) (x<<1|1)struct segTree
{int le,ri;int val;int mid(){return (le+ri)>>1;}
}tree[MAXN<<2];int a[MAXN];void build(int rt,int le,int ri){tree[rt].le=le;tree[rt].ri=ri;if(le==ri){tree[rt].val=a[le];return ;}int mid=tree[rt].mid();build(LL(rt), le, mid);build(RR(rt), mid+1, ri);tree[rt].val=tree[LL(rt)].val|tree[RR(rt)].val;
}void update(){}int query(int rt,int le,int ri){if(tree[rt].le==le&&tree[rt].ri==ri)return tree[rt].val;int mid=tree[rt].mid();if(ri<=mid)return query(LL(rt),le,ri);else if(le>mid)return query(RR(rt),le,ri);elsereturn query(LL(rt),le,mid)|query(RR(rt),mid+1,ri);
}int main() {int n,m;scanf("%d %d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}build(1, 1, n);int l,r;while(m--){scanf("%d %d",&l,&r);printf("%d\n",query(1, l, r));}return 0;
}

然后看到这题的提示是ST表,没学过,于是记录一波。
个人理解,ST表就是预先打表,但是对于区间来说,打表过程优化了,类似于二分打表,查询过程也是优化的,最多查询两段,但是整体上必须要求数据中途不会被修改。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;const int MAXN=2e5+2;#define LL(x) (x<<1)
#define RR(x) (x<<1|1)int a[MAXN],mn[MAXN][50],lg[MAXN];
int n,m;// 求log
void pre(){lg[1]=0;for(int i=2;i<=n;++i){lg[i]=lg[i>>1]+1;}
}// 打表
void ST_init(){for(int i=1;i<=n;++i){mn[i][0]=a[i];}for(int j=1;j<=lg[n];++j)for(int i=1;i<=n-(1<<j)+1;++i)mn[i][j]=mn[i][j-1]&mn[i+(1<<(j-1))][j-1];
}// 查询
int ST_query(int l,int r){int k=lg[r-l+1];return mn[l][k]&mn[r-(1<<k)+1][k];
}int main() {scanf("%d %d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}pre();ST_init();int l,r;while(m--){scanf("%d %d",&l,&r);printf("%d\n",ST_query(l, r));}return 0;
}

这篇关于MT3049 区间按位与(ST表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033307

相关文章

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

ST源码分析-st_init

SRS 的社群来了,想加入微信社群的朋友请购买《SRS原理》电子书,里有更高级的内容与答疑服务。 在上一篇文章《ST源码分析-lookupdns》里,已经通过一个简单的域名查询程序演示了 ST 协程的使用。 本文 主要分析 st_init() 函数的内部实现。 lookupdns 流程图如下: 在讲代码逻辑,流程之前,贴一张主要的数据结构关系图,方便大家参考: 全局变量如下:

ST源码分析-setjmp

SRS 的社群来了,想加入微信社群的朋友请购买《SRS原理》电子书,里有更高级的内容与答疑服务。 C语言中的 goto 实现的是函数内部的跳转,也就是 local jump。但是 C 标准库还有 setjmp() 跟 longjmp() 实现不同函数的跳转。这种不同函数的跳转叫做 long jump。下面就来介绍 C标准库 的 setjmp() 跟 longjmp() 函数的使用。 请阅读

ST源码分析-前言

SRS 的社群来了,想加入微信社群的朋友请购买《SRS原理》电子书,里有更高级的内容与答疑服务。 ST 是 state-thread 的缩写。state-thread 是一个 C 语言实现的协程库,这个库是 8年前的, 《state-thread 官网文档》。 ST 协程优势有以下几点: 1,从性能上来说,ST和传统的EDSM实现几乎一样快。也就是用 ST 跟用 单线程 epoll 一样

STM32三种调试工具CMSIS-DAP、J-Link和ST-Link

一.概述 CMSIS-DAP、J-Link和ST-Link均是嵌入式处理器的开发调试工具。 CMSIS-DAP是一种轻量级调试接口,旨在实现开源的开发调试。它的优点是使用方便、通用性好、成本低,还支持固件的在线升级。 J-Link是一款由德国公司SEGGER Microcontroller开发的高性能调试工具。但是价格较高。 ST-Link是由意法半导体公司开发的专为ST微控制器设计的工具

算法基础精选题单 动态规划(dp)(区间dp)(个人题解)

目录 前言: 正文:   题单:【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) NC50493 石子合并: NC50500 凸多边形的划分: NC235246 田忌赛马: NC13230 合并回文子串: NC16645 [NOIP2007]矩阵取数游戏: NC207781 迁徙

[POJ 3190] Stall Reservations (区间贪心)

POJ - 3190 给定若干个区间,问至少要分成几组 使得同组的区间互不重叠 典型的区间贪心问题 贪心的策略就是对左端点排序,然后依次选择安排 记录一下每个隔间最右端点的位置,然后用最小堆维护一下 当前区间尽可能地放到最右点最小的组里 如果这组依旧放不进去,就没有隔间能放得进去了 所以就要为其申请一个新的隔间 否则就把它安排到这个隔间里,并且更新此隔间最右端点 #p

[POJ 1328] Radar Installation (区间贪心)

POJ - 1328 给定若干个 x轴上方的点,要求最少的圆,使得每个点都被圆覆盖 其中圆心在 x轴上,半径为 D 有一个很直接的贪心思路,就是先考虑最左边未覆盖的点 在覆盖它的情况下,尽量把圆向左移。 这个做法是错误的,因为圆并不是矩形,例如以下数据 Input: 2 3 0 0 1 3 Output: 1 正确的做法是预处理出覆盖每个点的圆心的范围 然

[POJ 2376] Cleaning Shifts (区间贪心)

POJ - 2376 给定一个区间,要求用最少的区间将其覆盖 典型的区间贪心问题 首先将区间按左端点排序,然后考虑覆盖区间最左未覆盖位置 选择能覆盖此点,且右端点最靠右的区间覆盖它 要注意特判是否有合法解,如果途中无法覆盖某点, 或者所有区间都用完了也不能覆盖完即无解 #pragma comment(linker, "/STACK:102400000,102400000")

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵, 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另外一个主流仿真器 ST-Link 的使用方法,