区间专题

一. 区间最大最小值问题

  1. RMQ

int mx[N][20];                      //最多能保存524288的长度
int RMQ(int l, int r)   {
    int k = 0;  while (1<<(k+1) <= r - l + 1)   k++;        //令k为满足1<<k <= r-l+1的最大整数
    return max (mx[l][k], mx[r-(1<<k)+1][k]);               //区间最左边1<<k长度的最大值和最右边1<<k长度的最大值,可能有重叠
}

int main(void)    {
        for (int i=1; i<=n; ++i)    {
            scanf ("%d", &mx[i][0]);
        }
        for (int j=1; (1<<j)<=n; ++j)    {
            for (int i=1; i+(1<<j)-1<=n; ++i)   {
                mx[i][j] = max (mx[i][j-1], mx[i+(1<<(j-1))][j-1]);     //从i开始,长度1<<j的区间的最大值
            }
        }
        printf ("%d\n", RMQ (ql, qr));
}

  2. Segment_Tree

struct ST    {
    int mx[N<<2];
    void push_up(int rt)    {
        mx[rt] = max (mx[rt<<1], mx[rt<<1|1]);
    }
    void build(int l, int r, int rt)    {
        if (l == r)    {
            scanf ("%d", &mx[rt]);    return ;
        }
        int mid = (l + r) >> 1;
        build (lson);  build (rson);
        push_up (rt);
    }
    int query(int ql, int qr, int l, int r, int rt)    {
        if (ql <= l && r <= qr)    {
            return mx[rt];
        }
        int mid = (l + r) >> 1, ret = 0;
        if (ql <= mid)    ret = max (ret, query (ql, qr, lson));
        if (qr > mid)    ret = max (ret, query (ql, qr, rson));
        return ret;
    }
}st;

  

时间: 2024-08-05 06:35:41

区间专题的相关文章

「kuangbin带你飞」专题二十二 区间DP

layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - kuangbin - 区间DP - 动态规划 传送门 B.LightOJ - 1422 Halloween Costumes 题意 按顺序参加舞会,参加一个舞会要穿一种衣服,可以在参加完一个舞会后套上另一个衣服再去参加舞会,也可以在参加一个舞会的时候把外面的衣服脱了,脱到合适的衣服,但是脱掉的衣服不能再穿,参加完

区间dp专题练习

区间dp专题练习 题意 1.Equal Sum Partitions ? 这嘛东西,\(n^2\)自己写去 \[\ \] \[\ \] 2.You Are the One 感觉自己智力被吊打 \(dp[i][j]\)表示 , 对于当前的一个空栈 , \(i\)到\(j\)这一段都出栈的最小花费 显然是长得一副区间(诡)dp(异)的样子 , 如何转移呢?(建议自己想想吧) 对于一个\(dp[i][j]\),因为这个\(i\)必须是最先入栈的 , 所以我们可以枚举它的出栈时间\(k\) , 那么总贡

kb-07专题线段树-02--单点修改,区间最值

1 /* 2 区间单点该值,区间查询最大值: 3 hdu-1754 4 */ 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 using namespace std; 9 typedef struct 10 { 11 int l,r; 12 int value; 13 }V; 14 int n,m,a[200005]={0},MAX=-1; 15 V tr[800005]={0}; 16 voi

kb-07专题--线段树-01-单点修改,区间查和

给定区间长度,然后给两个操作,单点增加值和单点减值,询问一个区间的人数和:(水) 代码如下: 1 /* 2 写的第一个线段树,丑: 3 */ 4 #include<iostream> 5 #include<cstdio> 6 #include<cstring> 7 #include<algorithm> 8 using namespace std; 9 typedef struct 10 { 11 int l,r; 12 int value; 13 }tr[

线段树专题—POJ 3667 Hotel(区间合并模板)

题意:给一个n和m,表示n个房间,m次操作,操作类型有2种,一种把求连续未租出的房间数有d个的最小的最左边的房间号,另一个操作时把从x到x+d-1的房间号收回. 分析:这是一个区间合并的典型应用,基本只要套套模板就好了 下面是对区间合并的解释: up函数:当修改完此时的区间时,为了维护该区间上面区间值的正确性,向上回朔更新上面区间的值 down函数:把延迟标记下传,并修改下面区间的值,维护下面区间的正确性区间 (需要注意的是,up函数只有需要更新的时候才需要用到,而down只要是带延迟标记操作时

【贪心专题】POJ 1328 G - Radar Installation (区间覆盖)

链接:click here~~ 题意: Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only

【专题】区间dp

1.[nyoj737]石子合并 传送门:点击打开链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. 输入 有多组测试数据,输入到文件结束.每组测试数据第一行有一个整数n,表示有n堆石子.接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出 输出总代价的最小值,占单独的一行 样例输入 3 1 2 3

QBXT 2018春季DP&amp;图论班 2018.5.3 --- 区间DP专题

本文题目等来自北京大学张浩威学长的PPT. 1.区间DP:解决有关两个或以上的区间的合并或删除的问题(最大/小次数/价值.方案总数.可行性等). 2.石子合并: 有n堆石子排成一排,第i堆石子的个数为ai.每次可以将相邻两堆合并成一堆.合并的代价为两堆石子的石子个数之和.设计方案要求代价之和最小. 状态:dp[l][r]表示只考虑区间l~r的石子,将它们合并的最小代价. 状态转移:dp[l][r]=min{dp[l][r],dp[l][k]+dp[k+1][r]+s[r]-s[l-1]} l~r

专题训练之区间DP

例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 分析:我们dp[i][j]来表示合并第i堆到第j堆石子的最小代价.那么状态转移方程为dp[i][j]=min(dp[i][k]+dp[k+1][j]+w[i][j])  (s[i][j-1]<=k<