2 条题解
-
0
rmq静态稀疏表:
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; #define maxn 100005 #define re register int n,m,l,r,f[maxn][22]; int ask(int l,int r) { int k=log2(r-l+1); return min(f[l][k],f[r-(1<<k)+1][k]); } int main() { scanf("%d%d",&n,&m); for(re int i=1;i<=n;i++) scanf("%d",&f[i][0]); for(re int j=1;j<=20;j++) { for(int i=1;i<=n;i++) { if(i+(1<<j)-1<=n) { f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]); } } } for(re int i=1;i<=m;i++) { scanf("%d%d",&l,&r); printf("%d ",ask(l,r)); } return 0; } -
0
线段树方法:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define maxn 100005 #define re register #define INF 0x7fffffff struct tree { int l,r,Min=INF; }s[(maxn<<2)+5]; int n,m,L,R,data[maxn]; void update(int p) { s[p].Min=min(s[p<<1].Min,s[p<<1|1].Min); } void build(int p,int l,int r) { s[p].l=l; s[p].r=r; if(l==r) { s[p].Min=data[l]; return; } int mid=l+r>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); update(p); } inline int ask(int p,int l,int r) { if(l==s[p].l&&s[p].r==r) return s[p].Min; int mid=s[p].l+s[p].r>>1; if(r<=mid) return ask(p<<1,l,r); if(l>mid) return ask(p<<1|1,l,r); return min(ask(p<<1,l,mid),ask(p<<1|1,mid+1,r)); } int main() { scanf("%d%d",&n,&m); for(re int i=1;i<=n;i++) scanf("%d",&data[i]); build(1,1,n); for(re int i=1;i<=m;i++) { scanf("%d%d",&L,&R); printf("%d ",ask(1,L,R)); } return ~~(0-0); }
- 1
信息
- ID
- 1139
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 12
- 已通过
- 4
- 上传者