P1816 忠诚

题目描述

老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于 管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的 账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。

输入输出格式

输入格式:

输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。

第二行为m个数,分别是账目的钱数

后面n行分别是n个问题,每行有2个数字说明开始结束的账目编号。

输出格式:

输出文件中为每个问题的答案。具体查看样例。

输入输出样例

输入样例#1:

10 3
1 2 3 4 5 6 7 8 9 10
2 7
3 9
1 10
输出样例#1:

2 3 1

被线段树骗了进来。。。线段树写RMQ太水了,树状数组写RMQ更水,于是顺手温习了一遍ST表。

stlist[i][j]表示区间[i, i + 1 << j - 1]内的极值
初始状态:stlist[i][0] = num[i]
令M = log2 (n),n为元素个数 最好写成循环,打个表。这里偷懒没有打表,小心被无比黑心的出题人卡常(不过这种常数也太难卡了吧。。。)
状态转移方程:stlist[i][j] = max/min{stlist[i][j - 1], stlist[i + 1 <<(j - 1)][j - 1]} 算一算,区间分别是[i, i + 1 << (j - 1) - 1]和[i + 1 << (j - 1), i + 1 << j - 1],
合起来正好是stlist[i][j]表示的区间。这个比较好记,记住stlist[i][j - 1],以及stlist[x][j - 1],区间连续性,x很容易推出来 查询的时候,令M = log2(r - l + 1),即(r - l + 1)/2 < 2^M <= r - l + 1(区间长度)
查询区间[l,r]: max/min{stlist[l][M], stlist[r - 1 << M + 1][M]} 区间正好是[l, l + 1 << M - 1],[r - (1 << M - 1), r]
只需证 l + 2^M - 1 > r - 2^M + 1 + 1 即证2^M > (r - l + 1)/2 + 1 显然
我本来证不出来,拿去找MOdalao,换了三次不等式全是错的,后来发现我L和1混了然后少加了一个1,改成正确的之后,秒解这个弱智不等式。。
上代码
 #include <bits/stdc++.h>
const int INF = 0x3f3f3f3f;
const int MAXN = + ;
inline void read(int &x){
x = ;char ch = getchar();char c = ch;
while(ch > '' || ch < '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '',ch = getchar();
if(c == '-') x = -x;
}
inline int min(int a,int b){return a > b ? b : a;}
inline int max(int a,int b){return a > b ? a : b;}
int stlist[MAXN][],n,m;
void stwork(){
int M = ;
while( << (M + ) <= n)M ++;
for(int i = ;i <= M;i ++){
for(int j = n;j > ;j --){
stlist[j][i] = stlist[j][i - ];
if(j + ( << (i - )) <= n)stlist[j][i] = min(stlist[j][i], stlist[j + ( << (i - ))][i - ]);
}
}
}
int stfind(int l, int r){
int M = ;
while( << (M + ) <= (r - l + ))M ++;
return min(stlist[l][M], stlist[r - ( << M) + ][M]);//[l, l + 2 ^ M - 1],[r - ( 2 ^ M - 1), r] ,
}
int main(){
read(n);read(m);
for(int i = ;i <= n;i ++)read(stlist[i][]);
stwork();
for(int i = ;i <= m;i ++)
{
int tmp1,tmp2;
read(tmp1);read(tmp2);
printf("%d ", stfind(tmp1, tmp2));
}
return ;
}

【模板】ST表 洛谷P1816 忠诚的更多相关文章

  1. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  2. 洛谷 P1816 忠诚 题解

    P1816 忠诚 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财 ...

  3. 洛谷 P1816 忠诚

    https://www.luogu.org/problemnew/show/1816 st表模板 #include<cstdio> #include<algorithm> us ...

  4. Sequence(ST表)(洛谷P2048)

    超级钢琴 知识储备 在做这道题前,我们先要了解一下ST表(一种离线求区间最值的方法) ST表使用DP实现的,其查询复杂度为O(1). 那么我们怎么用DP实现呢?? 首先,我们设立一个状态f[i][j] ...

  5. 洛谷P1816 忠诚

    P1816 忠诚 569通过 1.5K提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 主席树的常数貌似大于线段树… TL ...

  6. 洛谷 P1816 忠诚 ST函数

    题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...

  7. 洛谷 P1816 忠诚题解

    题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...

  8. 【洛谷P1816 忠诚】线段树

    题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...

  9. 洛谷——P1816 忠诚

    https://www.luogu.org/problem/show?pid=1816#sub 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记 ...

随机推荐

  1. JDK源码阅读--HashMap

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...

  2. PAT甲级——A1091 Acute Stroke【30】

    One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...

  3. PAT甲级——A1080 Graduate Admission

    It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 applicati ...

  4. js时间操作getTime(),ios移动端真机上返回显示NAN

    ios移动端,js时间操作getTime(),getFullYear()等返回显示NaN的解决办法及原因 在做移动端时间转化为时间戳时,遇到了一个问题,安卓手机上访问时,能拿到时间戳,从而正确转换时间 ...

  5. ArrayBlockingQueue的使用案例:

    ArrayBlockingQueue的介绍: ArrayBlockingQueue,顾名思义:基于数组的阻塞队列.数组是要指定长度的,所以使用ArrayBlockingQueue时必须指定长度,也就是 ...

  6. vue生成条形码/二维码/带logo二维码

    条形码:https://blog.csdn.net/dakache11/article/details/83749410 //安装 cnpm install @xkeshi/vue-barcode / ...

  7. HBase Ganglia

  8. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

  9. [转]深入WPF--Style

    Style 用来在类型的不同实例之间共享属性.资源和事件处理程序,您可以将 Style 看作是将一组属性值应用到多个元素的捷径. 这是MSDN上对Style的描述,翻译的还算中规中矩.Style(样式 ...

  10. Miller Rabin算法学习笔记

    定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...