poj 2823 Sliding Window

题目链接:http://poj.org/problem?id=2823

解题思路:单调队列 或 RMQ

  1 //解题方法:单调队列
  2 
  3 ///////////////////////////////////////////////////////////////////////////
  4 //problem_id: poj 2823
  5 //user_id: SCNU20102200088
  6 ///////////////////////////////////////////////////////////////////////////
  7 
  8 #include <algorithm>
  9 #include <iostream>
 10 #include <iterator>
 11 #include <iomanip>
 12 #include <cstring>
 13 #include <cstdlib>
 14 #include <string>
 15 #include <vector>
 16 #include <cstdio>
 17 #include <cctype>
 18 #include <cmath>
 19 #include <queue>
 20 #include <stack>
 21 #include <list>
 22 #include <set>
 23 #include <map>
 24 using namespace std;
 25 
 26 ///////////////////////////////////////////////////////////////////////////
 27 typedef long long LL;
 28 const double PI=acos(-1.0);
 29 ///////////////////////////////////////////////////////////////////////////
 30 
 31 ///////////////////////////////////////////////////////////////////////////
 32 //Add Code:
 33 int MIN[1000005],MAX[1000005];
 34 
 35 struct Node{
 36     int key,tag;
 37     Node(int k=0,int t=0):key(k),tag(t){}
 38 }Min[1000005],Max[1000005];
 39 
 40 inline int Scanf(){
 41     int val=0,sgm=1;
 42     char c;
 43     while(true){
 44         c=getchar();
 45         if(c=='
' || c==' '){
 46             val=val*sgm;
 47             break;
 48         }
 49         if(c=='-') sgm=-1;
 50         if(c>='0' && c<='9') val=val*10+c-48;
 51     }
 52     return val;
 53 }
 54 
 55 inline void Print(int x){
 56     if(x<0){
 57         putchar('-');
 58         x=-x;
 59     }
 60     if(x==0){
 61         putchar('0');
 62         return;
 63     }
 64     char s[20];
 65     int len=0;
 66     while(x){
 67         s[len++]=x%10+'0';
 68         x/=10;
 69     }
 70     while(len--) putchar(s[len]);
 71     return;
 72 }
 73 ///////////////////////////////////////////////////////////////////////////
 74 
 75 int main(){
 76     ///////////////////////////////////////////////////////////////////////
 77     //Add code:
 78     int n,k,val,i;
 79     int Min_tail=0,Min_head=1;
 80     int Max_tail=0,Max_head=1;
 81     //scanf("%d%d",&n,&k);
 82     n=Scanf(),k=Scanf();
 83     for(i=1;i<=k;i++){
 84         //scanf("%d",&val);
 85         val=Scanf();
 86         while(Min_tail>=Min_head && Min[Min_tail].key>=val) Min_tail--;
 87         Min[++Min_tail]=Node(val,i);
 88         while(Max_tail>=Max_head && Max[Max_tail].key<=val) Max_tail--;
 89         Max[++Max_tail]=Node(val,i);
 90     }
 91     int id=1;
 92     MIN[id]=Min[Min_head].key,MAX[id]=Max[Max_head].key;
 93     for(i=k+1;i<=n;i++){
 94         //scanf("%d",&val);
 95         val=Scanf();
 96         while(Min_tail>=Min_head && Min[Min_tail].key>=val) Min_tail--;
 97         Min[++Min_tail]=Node(val,i);
 98         while(Max_tail>=Max_head && Max[Max_tail].key<=val) Max_tail--;
 99         Max[++Max_tail]=Node(val,i);
100         if(Min[Min_head].tag==id) Min_head++;
101         if(Max[Max_head].tag==id) Max_head++;
102         id++;
103         MIN[id]=Min[Min_head].key,MAX[id]=Max[Max_head].key;
104     }
105     for(i=1;i<id;i++){
106         //printf("%d ",MIN[i]);
107         Print(MIN[i]);
108         putchar(' ');
109     }
110     //printf("%d
",MIN[id]);
111     Print(MIN[id]);
112     putchar('
');
113     for(i=1;i<id;i++){
114         //printf("%d ",MAX[i]);
115         Print(MAX[i]);
116         putchar(' ');
117     }
118     //printf("%d
",MAX[id]);
119     Print(MAX[id]);
120     putchar('
');
121     ///////////////////////////////////////////////////////////////////////
122     return 0;
123 }
124 
125 ///////////////////////////////////////////////////////////////////////////
126 /*
127 Testcase:
128 Input:
129 8 3
130 1 3 -1 -3 5 3 6 7
131 Output:
132 -1 -3 -3 -3 3 3
133 3 3 5 5 6 7
134 */
135 ///////////////////////////////////////////////////////////////////////////

  1 //解题方法:RMQ
  2 
  3 ///////////////////////////////////////////////////////////////////////////
  4 //problem_id: poj 2823
  5 //user_id: SCNU20102200088
  6 ///////////////////////////////////////////////////////////////////////////
  7 
  8 #include <algorithm>
  9 #include <iostream>
 10 #include <iterator>
 11 #include <iomanip>
 12 #include <cstring>
 13 #include <cstdlib>
 14 #include <string>
 15 #include <vector>
 16 #include <cstdio>
 17 #include <cctype>
 18 #include <cmath>
 19 #include <queue>
 20 #include <stack>
 21 #include <list>
 22 #include <set>
 23 #include <map>
 24 using namespace std;
 25 
 26 ///////////////////////////////////////////////////////////////////////////
 27 typedef long long LL;
 28 const double PI=acos(-1.0);
 29 ///////////////////////////////////////////////////////////////////////////
 30 
 31 ///////////////////////////////////////////////////////////////////////////
 32 //Add Code:
 33 int a[1000005],Min[1000005],Max[1000005];
 34 
 35 int min(int a,int b){
 36     return a<b? a:b;
 37 }
 38 
 39 int max(int a,int b){
 40     return a>b? a:b;
 41 }
 42 
 43 void RMQ(int n,int k,int t){
 44     int i,j;
 45     for(i=1;i<=n;i++) Max[i]=Min[i]=a[i];
 46     for(i=1;i<=t;i++){
 47         for(j=1;j+(1<<i)-1<=n;j++){
 48             Min[j]=min(Min[j],Min[j+(1<<(i-1))]);
 49             Max[j]=max(Max[j],Max[j+(1<<(i-1))]);
 50         }
 51     }
 52 }
 53 
 54 inline int Scanf(){
 55     int val=0,sgm=1;
 56     char c;
 57     while(true){
 58         c=getchar();
 59         if(c=='
' || c==' '){
 60             val=val*sgm;
 61             break;
 62         }
 63         if(c=='-') sgm=-1;
 64         if(c>='0' && c<='9') val=val*10+c-48;
 65     }
 66     return val;
 67 }
 68 
 69 inline void Print(int x){
 70     if(x<0){
 71         putchar('-');
 72         x=-x;
 73     }
 74     if(x==0){
 75         putchar('0');
 76         return;
 77     }
 78     char s[20];
 79     int len=0;
 80     while(x){
 81         s[len++]=x%10+'0';
 82         x/=10;
 83     }
 84     while(len--) putchar(s[len]);
 85     return;
 86 }
 87 ///////////////////////////////////////////////////////////////////////////
 88 
 89 int main(){
 90     ///////////////////////////////////////////////////////////////////////
 91     //Add code:
 92     int n,k,i,t=0;
 93     //scanf("%d%d",&n,&k);
 94     n=Scanf(),k=Scanf();
 95     for(i=1;i<=n;i++){
 96         //scanf("%d",&a[i]);
 97         a[i]=Scanf();
 98     }
 99     while((1<<(t+1))<=k) t++;  //求满足2^t<=k的最大的t
100     RMQ(n,k,t);
101     for(i=1;i<=n-k+1;i++){
102         //printf("%d",min(Min[i],Min[i+k-(1<<t)]));
103         Print(min(Min[i],Min[i+k-(1<<t)]));
104         //if(i<n-k+1) printf(" ");
105         if(i<n-k+1) putchar(' ');
106         //else printf("
");
107         else putchar('
');
108     }
109     for(i=1;i<=n-k+1;i++){
110         //printf("%d",max(Max[i],Max[i+k-(1<<t)]));
111         Print(max(Max[i],Max[i+k-(1<<t)]));
112         //if(i<n-k+1) printf(" ");
113         if(i<n-k+1) putchar(' ');
114         //else printf("
");
115         else putchar('
');
116     }
117     ///////////////////////////////////////////////////////////////////////
118     return 0;
119 }
120 
121 ///////////////////////////////////////////////////////////////////////////
122 /*
123 Testcase:
124 Input:
125 8 3
126 1 3 -1 -3 5 3 6 7
127 Output:
128 -1 -3 -3 -3 3 3
129 3 3 5 5 6 7
130 */
131 ///////////////////////////////////////////////////////////////////////////
原文地址:https://www.cnblogs.com/linqiuwei/p/3263730.html