最敏捷的机器人
https://loj.ac/problem/10120
题目描述
??有\(n\)个数,给出\(k\),求出从\(i\)到\(i+k-1\)中的最大值和最小值。
思路
??定长区间的询问问题,我们显然可以用两个单调队列维护最大值和最小值,不过这题放在\(ST\)算法中,我就写了\(ST\)表。
代码
#include <bits/stdc++.h> using namespace std; const int N=1e5+10,LogN=20; int read() { int res=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+ch-'0';ch=getchar();} return res*w; } void write(int x) { if(x<0){putchar('-');x=-x;} if(x>9)write(x/10); putchar(x%10+'0'); } void writeln(int x) { write(x); putchar('\n'); } int ffmin[N][LogN+2],ffmax[N][LogN+2],lg[N]; int main() { int n,k; n=read();k=read(); for(int i=1;i<=n;i++) ffmin[i][0]=ffmax[i][0]=read(); lg[0]=-1; for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1; for(int j=1;j<=LogN;j++) for(int i=1;i+(1<<j)-1<=n;i++) { ffmax[i][j]=max(ffmax[i][j-1],ffmax[i+(1<<j-1)][j-1]); ffmin[i][j]=min(ffmin[i][j-1],ffmin[i+(1<<j-1)][j-1]); } for(int i=1;i<=n-k+1;i++) { int l=lg[k]; write(max(ffmax[i][l],ffmax[i+k-(1<<l)][l])); putchar(' '); writeln(min(ffmin[i][l],ffmin[i+k-(1<<l)][l])); } }
相关推荐
quyunfei 2020-11-19
机器人智力研究 2020-11-18
聊天终结者机器人 2020-11-18
txq0 2020-11-20
zCSDN 2020-11-09
机器人智力研究 2020-11-05
ARMOTO机器人 2020-11-06
txq0 2020-11-06
遇见人工智能 2020-11-03
聊天终结者机器人 2020-11-02
clliuhust 2020-10-30
yatou0 2020-10-29
雨燕 2020-10-29
nodid 2020-10-29
yatou0 2020-10-29
zCSDN 2020-10-27
dhyddy 2020-10-27
聊天终结者机器人 2020-10-26