您的位置:首页 > 运维架构

bzoj 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 RMQ

2017-10-04 13:46 543 查看

Description

    洞窟里有一道长长的通道.它由N(1≤N≤25000)段道尾相连构成,编号分别为1到N.每个通道有一个阈值,其范围在[1,10^9]依次通过i..j的通道,那奶牛的体重指数就不能超过i..j通道中阈值的最小值.贝茜有Q(1≤Q≤25000)个问题,想请教你由i到j的通道的阈值的最小值.

Input

    第1行输入N和Q,接下来N行输入每个通道的阈值,之后Q行每行两个整数,对应问题中的i和j(i<j).

Output

   对于每个问题,输出其结果.

Sample Input

10 4

75

30

100

38

50

51

52

20

81

5

1 10

3 5

6 9

8 10

Sample Output

5

38

20

5

HINT

Source

Orange

显然是裸的RMQ。。。

第一篇博客庆祝一下中秋节

没事闲的又打了一下线段树。。

也是第一个线段树吧

/**************************************************************
Problem: 3381
User: tangyunkai1
Language: C++
Result: Accepted
Time:120 ms
Memory:2852 kb
****************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[25005][16];
int main ()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&dp[i][0]);
}
for(int j=1;j<=15;j++)
{
for(int i=1;i<=n;i++)
{
if(i-1+(1<<j)>n) break;
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
//printf("%d %d %d\n",i,i-1+(1<<j),dp[i][j]);
}
}
for(int i=1;i<=q;i++)
{
int l,r;
scanf("%d%d",&l,&r);
int len=r-l+1;
int j;
for(j=1;j<=15;j++)
{
if((1<<j)>len) break;
}
j-=1;
int ans=min(dp[l][j],dp[r-(1<<j)+1][j]);
printf("%d\n",ans);
}
return 0;
}
/*
10 4
75 30 100 38 50 51 52 20 81 5
1 10
3 5
6 9
8 10
*/

/**************************************************************
Problem: 3381
User: tangyunkai1
Language: C++
Result: Accepted
Time:136 ms
Memory:2576 kb
****************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct nodesegtree
{
int l;
int r;
int min_val;
}segtree[100005];
int a[30005];
void build(int l,int r,int num)
{
segtree[num].l=l;
segtree[num].r=r;
if(l==r)
{
segtree[num].min_val=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,num*2);
build(mid+1,r,num*2+1);
segtree[num].min_val=min(segtree[num*2].min_val,segtree[num*2+1].min_val);
}
int ans;
void minn(int x,int y,int num)
{
int l=segtree[num].l;
int r=segtree[num].r;
if(l>=x&&r<=y)
{
ans=min(ans,segtree[num].min_val);
}
else if(y>=l&&x<=r)
{
minn(x,y,num*2);
minn(x,y,num*2+1);
}
}
int main ()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,n,1);
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ans=999999999;
minn(x,y,1);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: