码迷,mamicode.com
首页 > 其他好文 > 详细

TYVJ 1038忠诚 ST 求区间最值

时间:2015-03-20 01:13:20      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

  已经不搞ACM了,就是最近随便做点题,就在这里存个代码

  

  

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 const int maxn = 100005;
 5 int a[maxn][20];
 6 int x[maxn];
 7 void init(int n)
 8 {
 9     for(int i = 1;i<=n;++i)a[i][0] = x[i];
10     int s = 1,r = 0;
11     while(s*2<n)s*=2,r++;
12     for(int i = 1;i<=r;++i)
13     {
14         int len = (1<<i)-1;
15         for(int j = 1;j+len<=n;++j)
16             a[j][i] = min(a[j][i-1],a[j+(len+1)/2][i-1]);
17     }
18 
19 }
20 int query(int l,int r)
21 {
22     int len = 1;
23     int k = 0;
24     while(len*2<r-l+1)k++,len*=2;
25     return min(a[l][k],a[r-len+1][k]);
26 }
27 int main()
28 {
29 //    freopen("in.txt","r",stdin);
30     int n,m;
31     while(~scanf("%d%d",&m,&n))
32     {
33         for(int i = 1;i<=m;++i)scanf("%d",&x[i]);
34         init(m);
35         int first = 1;
36         for(int i = 1;i<=n;++i)
37         {
38             int l,r;
39             scanf("%d%d",&l,&r);
40             if(first){first = 0;printf("%d",query(l,r));continue;}
41             printf(" %d",query(l,r));
42         }
43         puts("");
44     }
45     return 0;
46 }

 

TYVJ 1038忠诚 ST 求区间最值

标签:

原文地址:http://www.cnblogs.com/GJKACAC/p/4352278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!