Wind设计了不少机器人。可是它们都认为本身是最强的,因而,一场比赛开始了……机器人们都想知道谁是最敏捷
的,因而它们进行了以下一个比赛。首先,他们面前会有一排共n个数,它们比赛看谁能最早把每连续k个数中最大
和最小值写下来,固然,这些机器人运算速度都很快,它们比赛的是谁写得快。可是Wind也想知道答案,你能帮助
他吗?
5 3
1 2 3 4 5
3 1
4 2
5 3
【注释】
因为输入文件太大。特将数据范围缩小10倍,但愿你们努力优化算法。
陷入被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 }