最敏捷的机器人
最敏捷的机器人
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 88 Solved: 39
[Submit][Status][Web Board][Edit] [TestData]
Description
Wind设计了很多机器人。但是它们都认为自己是最强的,于是,一场比赛开始了……机器人们都想知道谁是最敏捷
的,于是它们进行了如下一个比赛。首先,他们面前会有一排共n个数,它们比赛看谁能最先把每连续k个数中最大
和最小值写下来,当然,这些机器人运算速度都很快,它们比赛的是谁写得快。但是Wind也想知道答案,你能帮助
他吗?
的,于是它们进行了如下一个比赛。首先,他们面前会有一排共n个数,它们比赛看谁能最先把每连续k个数中最大
和最小值写下来,当然,这些机器人运算速度都很快,它们比赛的是谁写得快。但是Wind也想知道答案,你能帮助
他吗?
Input
每组测试数据
第1行为n,k(1<=k<=n<=100000)
第2行共n个数,为数字序列,所有数字均在longint范围内。
第1行为n,k(1<=k<=n<=100000)
第2行共n个数,为数字序列,所有数字均在longint范围内。
Output
共n-k+1行
第i行为第i~i+k-1这k个数中的最大和最小值
第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洞
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 }