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 }