luoguP1440 求m区间内的最小值
Posted sevenyuanluo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luoguP1440 求m区间内的最小值相关的知识,希望对你有一定的参考价值。
emmmmmm
看到这道题的第一反应嘛
(区间最小,大概是RMQ吧
然后,华丽丽的80分
(题解说st表会T两个点,可是我是MLE emmmm。。。
貌似st表不能做,有一个滚动数组的优化,可以看看题解学一下
这里我改用了单调队列的做法
(本来用的STL的队列,但是学长说不方便,开一个数组即可 [而且我STL队列还没写出来23333
emmmm(不知道怎么讲
看代码吧
#include<cstdio> using namespace std; const int maxn = 2000010; int q[maxn][2];//q[maxn][0]记录数,[1]记录输入的次序 int main(){ int n,m; scanf("%d%d",&n,&m); printf("0 ");//第一个前面没有数,提前输出0比较方便 int head = 0,tail = 0; scanf("%d",&q[tail][0]); tail++; for(int i = 1;i < n;i++){ if(i - q[head][1] > m)//每次循环判断是否是前m个数 head ++;//不是的话指针后移,弹出一位 printf("%d ",q[head][0]);//输出当前的最小值,第一次循环即为第一个数 int x; scanf("%d",&x); while(tail > head && x < q[tail - 1][0])//判断输入的这个数是不是最小的 tail --;//尾指针前移,当前值覆盖上一个比该值大的值 q[tail][0] = x;//压入队列 q[tail][1] = i; tail++;//保证队列不为空 } return 0; }
然后就没有然后啦
最后放一下80分代码
(假装是把st表的模版题题解放上来了,就不写st表模版的题解了emmmm
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define maxn 2000005 int dp[maxn][20]; int n,m; int a[maxn],b[maxn]; void RMQ(){ for(int i = 1;i <= n;i++) dp[i][0] = a[i];//初始化 for(int j = 1;(1 << j) <= n;j++) for(int i = 1;i <= n - (1 << j) + 1;i++) dp[i][j] = min(dp[i][j - 1],dp[i + (1 << (j - 1))][j - 1]);//状态转移方程 int x = 0; for(int i = 1;i <= n;i++){ if((1 << (x + 1)) <= i) x++; b[i] = x;//提前预处理每段区间长度的log,保证完全O(n) } } int query(int L,int R){ int k = b[R - L + 1]; return min(dp[L][k],dp[R - (1 << k) + 1][k]);//询问 } int main(){ scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++) scanf("%d",&a[i]); RMQ(); for(int i = 1;i <= n;i++){ if(i == 1){ printf("0 "); continue; } else if(i == 2){ printf("%d ",a[1]); continue; }//提前输出两个确定值 int L = i - m; if(i - m <= 0)L = 1;//特判 int R = i - 1; printf("%d ",query(L,R)); } return 0; }
zyr学长讲的太好了!!!
他tql!!!
%%%(放blog地址膜一下
我听完了觉得自己不可能讲的那么清楚于是就不讲了吧233333
以上是关于luoguP1440 求m区间内的最小值的主要内容,如果未能解决你的问题,请参考以下文章