最敏捷的機器人

最敏捷的機器人

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 88  Solved: 39
[Submit][Status][Web Board][Edit] [TestData]

Description

Wind設計了不少機器人。可是它們都認爲本身是最強的,因而,一場比賽開始了……機器人們都想知道誰是最敏捷
的,因而它們進行了以下一個比賽。首先,他們面前會有一排共n個數,它們比賽看誰能最早把每連續k個數中最大
和最小值寫下來,固然,這些機器人運算速度都很快,它們比賽的是誰寫得快。可是Wind也想知道答案,你能幫助
他嗎? 

Input

每組測試數據 
第1行爲n,k(1<=k<=n<=100000) 
第2行共n個數,爲數字序列,全部數字均在longint範圍內。 

Output

共n-k+1行 
第i行爲第i~i+k-1這k個數中的最大和最小值 

Sample Input

5 3
1 2 3 4 5

Sample Output

3 1
4 2
5 3 
【註釋】
因爲輸入文件太大。特將數據範圍縮小10倍,但願你們努力優化算法。 

HINT

陷入被printf坑成瘋狂RE的INF洞php

 

 1 #include <iostream>
 2 #include <climits>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define inf INT_MAX
 6 using namespace std;
 7 struct point{
 8     int maxv,minv;
 9 }tree[400010];
10 int n,k;
11 int a[100001];
12 struct segment_tree{
13     void Build(int root,int l,int r)
14     {
15         if (l==r)
16         {
17             tree[root].maxv=tree[root].minv=a[l];
18             return;
19         }
20         int mid=(l+r)>>1;
21         Build(root*2,l,mid);
22         Build(root*2+1,mid+1,r);
23         tree[root].maxv=max(tree[root*2].maxv,tree[root*2+1].maxv);
24         tree[root].minv=min(tree[root*2].minv,tree[root*2+1].minv);
25     }
26     void Query(int root,int l,int r,int x,int y,int &maxx,int &minx)
27     {
28         if (x<=l && y>=r)
29         {
30             maxx=max(tree[root].maxv,maxx);
31             minx=min(tree[root].minv,minx);
32             return;
33         }
34         int mid=(l+r)>>1;
35         if (x<=mid)
36             Query(root*2,l,mid,x,y,maxx,minx);
37         if (y>mid)
38             Query(root*2+1,mid+1,r,x,y,maxx,minx);
39     }
40 }S;
41 int main()
42 {
43     scanf("%d%d",&n,&k);
44     for (int i=1;i<=n*4+1;i++)
45         tree[i].maxv=-inf,tree[i].minv=inf;
46     for (int i=1;i<=n;i++)
47         scanf("%d",&a[i]);
48     S.Build(1,1,n);
49     for (int i=1;i<=n-k+1;i++)
50     {
51         int maxx=-inf,minx=inf;
52         S.Query(1,1,n,i,i+k-1,maxx,minx);
53         printf("%d",maxx),putchar(' '),printf("%d\n",minx);
54     }
55     return 0;
56 }
robot
相關文章
相關標籤/搜索