• 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 ///////////////////////////////////////////////////////////////////////////
  • 相关阅读:
    编码转换,基础补充,深浅拷贝,id is == ,代码块(了解),小数据池(了解)
    字典(dict),字典的嵌套,集合(set)
    列表,列表的增删改查,列表的嵌套,range
    整数,布尔值,字符串,字符串详解.
    [小明学Shader]4.自定义光照----RampTexture
    [小明学Shader]3.自定义光照,半拉姆伯特
    [小明学Shader]2.理解Shader和Material的关系
    [小明学Shader]1.Diffuse
    [UGUI]你说UnityEngine.UI.Button是怎么通过拖动来增加OnClick的监听器的呢?
    [小明也得懂架构]1.架构初探
  • 原文地址:https://www.cnblogs.com/linqiuwei/p/3263730.html
Copyright © 2020-2023  润新知