首页 > 其他分享 >51nod1174 区间中最大的数RMQ

51nod1174 区间中最大的数RMQ

时间:2024-03-19 22:33:05浏览次数:26  
标签:RMQ Min int rep 查询 -- 51nod1174 区间

给出一个有n个数的序列,下标0~n-1,有Q次查询,每次询问区间[l,r]的最大值。

如果有修改,可以考虑线段树,这里只有静态查询,可以用ST表,预处理时间O(nlogn),单次查询时间O(1)。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

const int N = 100005;
int n, Q, a[N], Min[N][21], Max[N][21];
int qmin(int l, int r) {
    int k = log2(r-l);
    return min(Min[l][k], Min[r-(1<<k)][k]);
}
int qmax(int l, int r) {
    int k = log2(r-l);
    return max(Max[l][k], Max[r-(1<<k)][k]);
}
void solve() {
    cin >> n;
    rep(i,1,n) cin >> a[i];
    rep(i,1,n) Min[i][0] = Max[i][0] = a[i];
    rep(j,1,20) {
        for (int i = 1; i+(1<<j) <= n+1; i++) {
            Min[i][j] = min(Min[i][j-1], Min[i+(1<<(j-1))][j-1]);
            Max[i][j] = max(Max[i][j-1], Max[i+(1<<(j-1))][j-1]);
        }
    }
    cin >> Q;
    while (Q--) {
        int x, y;
        cin >> x >> y;
        x++, y++;
        cout << qmax(x, y+1) << "\n";
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:RMQ,Min,int,rep,查询,--,51nod1174,区间
From: https://www.cnblogs.com/chenfy27/p/18084138

相关文章

  • EBS 财务模块各个区间状态
    selectappl.product_code应用,appl.application_short_name应用简称,gld.name帐套,gps.period_name期间,gps.closing_status期间状态--期间状态:'N'=>从未打开,'F'=>将来可输入,'O'......
  • P1712 [NOI2016] 区间 线段树+双指针
    //Problem://P1712[NOI2016]区间////Contest:Luogu//URL:https://www.luogu.com.cn/problem/P1712//MemoryLimit:250MB//TimeLimit:1000ms////PoweredbyCPEditor(https://cpeditor.org)#include<iostream>#include<algorithm......
  • 单调队列 维护区间最值(板子+两道练手)
    1.P1886滑动窗口/【模板】单调队列https://www.luogu.com.cn/problem/P1886板子题,传送门在上方//Problem://P1886滑动窗口/【模板】单调队列////Contest:Luogu//URL:https://www.luogu.com.cn/problem/P1886//MemoryLimit:500MB//TimeLimit:1......
  • CF1514D-区间(绝对)众数-莫队、随机化、可持久化线段树
    link:https://codeforces.com/contest/1514/problem/D很久以前小号打的场了,当时D题写的莫队,现在重新来看看。题意:给一个序列\([a_1,\dots,a_n]\),有q次询问,每次问:把\([a_l,\dots,a_r]\)划分最少几个不相交子序列,才能使得每个子序列是beautiful的。称一个序列\(a_1,\dots,a_x\)......
  • 美丽区间
    题目链接戳这Solution因为n很小所以可以n方枚举左右端点,然后实际上就是判断前面一半将69交换后是否是个回文且这个回文不存在反转后没意义的数,对于那几个翻转后没意义的数字随便用字母代替即可,对于前缀和后缀分别哈希然后判断是否相等即可。#include<bits/stdc++.h>#defin......
  • leedcode-汇总区间
    自己写的:classSolution:defsummaryRanges(self,nums):my_li=[]#创建一个空列表用于存储结果ifnotnums:#如果输入列表为空returnmy_li#返回空列表iflen(nums)==1:#如果输入列表只有一个元素my......
  • Github高级搜索【指定日期区间,星星数,用户仓库名多条件精确搜索】
    小伙伴们号,欢迎关注,一起学习,无限进步GitHub高级搜索允许用户使用多种条件来精确查找所需的仓库、文件和代码。以下是对GitHub高级搜索的最全、详细总结说明:文章目录关键字搜索仓库名搜索用户搜索组织搜索文件搜索语言搜索星星数搜索更新时间搜索授权搜索组合搜索排......
  • abc343F 区间第2大的出现次数
    给定数组a[n],有Q组操作,格式为:1px,将a[p]修改为x;2lr,查询区间[l,r]内第2大元素的出现次数。1<=n,q<=2e5;1<=a[i]<=1e9用线段树维护各个区间的最大及次大元素的出现次数,合并时最多只保留两条记录。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#......
  • 435. 无重叠区间c
    typedefstructnode{intleft;intright;}bounds;intcmp(constvoid*a,constvoid*b){bounds*x=(bounds*)a;bounds*y=(bounds*)b;if(x->right>y->right)return1;return-1;}interaseOverlapIntervals(int**interva......
  • lc795 区间子数组个数
    给定数组nums[n]和两个整数left,right,找出nums中连续非空、并且最大元素在[left,right]范围内的子数组,统计所有满足条件子数组的个数。1<=n<=1e5;0<=nums[i]<=1e9;0<=left<=right<=1e9;保证答案在int内枚举每个元素作为最大元素的情况,统计对应的子数组数量,如果arr[i]在允许范......