poj 2823 poj 3264 線段樹維護最大最小值

題目:Sliding Window


大體內容:

    題意:從後往前掃描k長的段,輸出每段的最小值,最大值
    解法:由於時間的原因可以選擇線段樹(RMQ更佳)

具體分析

    線段樹維護一個最大值和最小值
    查詢的時候不同於以往,向下遞歸不改變段的左右區間(具體見代碼)
  1. /************************************************************************* 
  2.     > File Name: poj12823.cpp 
  3.     > Author: cy 
  4.     > Mail: [email protected]  
  5.     > Created Time: 14/10/16 18:45:46 
  6.  ************************************************************************/ 
  7.  
  8. #include<iostream> 
  9. #include<cstring> 
  10. #include <algorithm> 
  11. #include<cstdlib> 
  12. #include<vector> 
  13. #include<cmath> 
  14. #include<stdlib.h> 
  15. #include<iomanip> 
  16. #include<list> 
  17. #include<deque> 
  18. #include<map> 
  19. #include <stdio.h> 
  20. #include <queue> 
  21.  
  22. #define maxn 4000100+5 
  23.  
  24. #define inf 0x3f3f3f3f 
  25.   #define INF 0x3FFFFFFFFFFFFFFFLL 
  26. #define rep(i,n) for(i=0;i<n;i++) 
  27.  #define reP(i,n) for(i=1;i<=n;i++) 
  28.  
  29. #define ull unsigned long long 
  30.  #define ll long long 
  31. #define LL(x) x<<1 
  32.  #define RR(x) x<<1|1 
  33.  
  34. #define cle(a) memset(a,0,sizeof(a)) 
  35.  
  36. using namespace std; 
  37. struct node{ 
  38.     int l,r,mi,ma,val; 
  39.     int mid(){ 
  40.         return (l+r)>>1
  41.     } 
  42. }tree[maxn]; 
  43. void doit(int rt){ 
  44.     tree[rt].mi=min(tree[LL(rt)].mi,tree[RR(rt)].mi);tree[rt].ma=max(tree[LL(rt)].ma,tree[RR(rt)].ma); 
  45. void build(int rt,int l,int r){ 
  46.     tree[rt].l=l,tree[rt].r=r; 
  47.     if(l==r){ 
  48.         scanf("%d",&tree[rt].val);tree[rt].mi=tree[rt].ma=tree[rt].val; 
  49.     //    cout<<tree[rt].val<<endl; 
  50.         return
  51.     } 
  52.     int mid=(l+r)>>1;build(LL(rt),l,mid);build(RR(rt),mid+1,r); 
  53.     doit(rt); 
  54. int querymin(int rt,int l,int r){ 
  55.     if(l<=tree[rt].l&&r>=tree[rt].r){ 
  56.         return tree[rt].mi; 
  57.     } 
  58.     int mid=tree[rt].mid(); 
  59.     int ans1=inf,ans2=inf; 
  60.     if(l<=mid)ans1=querymin(LL(rt),l,r);//注意的地方(l,r)而不是(l,mid) 
  61.     if(r>mid)ans2=querymin(RR(rt),l,r); 
  62.     return min(ans1,ans2); 
  63. int querymax(int rt,int l,int r){ 
  64.     if(l<=tree[rt].l&&r>=tree[rt].r){ 
  65.         return tree[rt].ma; 
  66.     } 
  67.     int mid=tree[rt].mid(); 
  68.     int ans1=-1000000000,ans2 =-1000000000
  69.     if(l<=mid)ans1=querymax(LL(rt),l,r); 
  70.     if(r>mid)ans2=querymax(RR(rt),l,r); 
  71.     return max(ans1,ans2); 
  72. int main() 
  73. #ifndef ONLINE_JUDGE 
  74.      freopen("in.txt","r",stdin); 
  75.      //freopen("out.txt","w",stdout); 
  76. #endif 
  77.     int n,m; 
  78.     while(scanf("%d%d",&n,&m)!=EOF){ 
  79.         int i,j; 
  80.         build(1,1,n); 
  81.         for(i=1;i<=n-m+1;i++) 
  82.         { 
  83.             printf("%d ",querymin(1,i,i+m-1)); 
  84.         } 
  85.         printf("\n"); 
  86.         for(i=1;i<=n-m+1;i++) 
  87.         { 
  88.             printf("%d ",querymax(1,i,i+m-1)); 
  89.         } 
  90.         printf("\n"); 
  91.     } 
  92.     return 0
  93. }

題目:Balanced Lineup

大體內容

   題意:給你區間,求此區間最大的差
   解法:同上,維護最大最小值

具體分析

  同上
  1. /************************************************************************* 
  2.     > File Name: poj3264.cpp 
  3.     > Author: cy 
  4.     > Mail: [email protected]  
  5.     > Created Time: 14/10/16 23:14:33 
  6.  ************************************************************************/ 
  7. #include<iostream> 
  8. #include<cstring> 
  9. #include <algorithm> 
  10. #include<cstdlib> 
  11. #include<vector> 
  12. #include<cmath> 
  13. #include<stdlib.h> 
  14. #include<iomanip> 
  15. #include<list> 
  16. #include<deque> 
  17. #include<map> 
  18. #include <stdio.h> 
  19. #include <queue> 
  20.  
  21. #define maxn 4000100+5 
  22.  
  23. #define inf 0x3f3f3f3f 
  24.   #define INF 0x3FFFFFFFFFFFFFFFLL 
  25. #define rep(i,n) for(i=0;i<n;i++) 
  26.  #define reP(i,n) for(i=1;i<=n;i++) 
  27.  
  28. #define ull unsigned long long 
  29.  #define ll long long 
  30. #define LL(x) x<<1 
  31.  #define RR(x) x<<1|1 
  32.  
  33. #define cle(a) memset(a,0,sizeof(a)) 
  34.  
  35. using namespace std; 
  36. struct node{ 
  37.     int l,r,mi,ma,val; 
  38.     int mid(){ 
  39.         return (l+r)>>1
  40.     } 
  41. }tree[maxn]; 
  42. void doit(int rt){ 
  43.     tree[rt].mi=min(tree[LL(rt)].mi,tree[RR(rt)].mi);tree[rt].ma=max(tree[LL(rt)].ma,tree[RR(rt)].ma); 
  44. void build(int rt,int l,int r){ 
  45.     tree[rt].l=l,tree[rt].r=r; 
  46.     if(l==r){ 
  47.         scanf("%d",&tree[rt].val);tree[rt].mi=tree[rt].ma=tree[rt].val; 
  48.     //    cout<<tree[rt].val<<endl; 
  49.         return
  50.     } 
  51.     int mid=(l+r)>>1;build(LL(rt),l,mid);build(RR(rt),mid+1,r); 
  52.     doit(rt); 
  53. int querymin(int rt,int l,int r){ 
  54.     if(l<=tree[rt].l&&r>=tree[rt].r){ 
  55.         return tree[rt].mi; 
  56.     } 
  57.     int mid=tree[rt].mid(); 
  58.     int ans1=inf,ans2=inf; 
  59.     if(l<=mid)ans1=querymin(LL(rt),l,r);//注意的地方(l,r)而不是(l,mid) 
  60.     if(r>mid)ans2=querymin(RR(rt),l,r); 
  61.     return min(ans1,ans2); 
  62. int querymax(int rt,int l,int r){ 
  63.     if(l<=tree[rt].l&&r>=tree[rt].r){ 
  64.         return tree[rt].ma; 
  65.     } 
  66.     int mid=tree[rt].mid(); 
  67.     int ans1=-1000000000,ans2 =-1000000000
  68.     if(l<=mid)ans1=querymax(LL(rt),l,r); 
  69.     if(r>mid)ans2=querymax(RR(rt),l,r); 
  70.     return max(ans1,ans2); 
  71. int main() 
  72. #ifndef ONLINE_JUDGE 
  73.      freopen("in.txt","r",stdin); 
  74.      //freopen("out.txt","w",stdout); 
  75. #endif 
  76.     int n,m; 
  77.     while(scanf("%d%d",&n,&m)!=EOF){ 
  78.         int i,j; 
  79.         build(1,1,n); 
  80.         rep(i,m){ 
  81.             int x,y;scanf("%d%d",&x,&y); 
  82.             printf("%d\n",querymax(1,x,y)-querymin(1,x,y)); 
  83.         }     
  84.     } 
  85.     return 0
  86. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章