poj1363 Rails Central Europe 1997

P.S.:

输出换行

三个方法

1.直接按照要求做

根据给的数,需要push,pop哪些数据,具有唯一性

数最多进栈一次,出栈一次

O(n)

  1 Source Code
  2 Problem: 1363        User: congmingyige
  3 Memory: 728K        Time: 63MS
  4 Language: G++        Result: Accepted
  5 
  6     Source Code
  7 
  8     #include <cstdio>
  9     #include <cstdlib>
 10     #include <cmath>
 11     #include <cstring>
 12     #include <string>
 13     #include <algorithm>
 14     #include <iostream>
 15     using namespace std;
 16     #define ll long long
 17 
 18     const double eps=1e-8;
 19     const ll inf=1e9;
 20     const ll mod=1e9+7;
 21     const int maxn=1e5+10;
 22 
 23     int a[maxn];
 24     int st[maxn];
 25 
 26     int main()
 27     {
 28         int n,i,j,g;
 29         bool line=0;
 30         while (1)
 31         {
 32             scanf("%d",&n);
 33             if (n==0)
 34                 break;
 35 
 36             if (!line)
 37                 line=1;
 38             else
 39                 printf("
");
 40 
 41             g=0;
 42             while (1)
 43             {
 44                 scanf("%d",&a[1]);
 45                 if (a[1]==0)
 46                     break;
 47                 for (i=2;i<=n;i++)
 48                     scanf("%d",&a[i]);
 49 
 50                 j=0;
 51                 for (i=1;i<=n;i++)
 52                 {
 53                     while (j<a[i])
 54                         st[++g]=++j;
 55                     if (st[g]==a[i])
 56                         g--;
 57                     else
 58                         break;
 59                 }
 60 
 61                 if (i==n+1)
 62                     printf("Yes
");
 63                 else
 64                     printf("No
");
 65             }
 66         }
 67         return 0;
 68     }
 69     /*
 70     6
 71     1 3 2 4 6 5
 72     1 4 3 5 2 6
 73     1 3 6 5 2 4
 74     5 4 3 2 1 6
 75     5 3 2 1 6 4
 76     1 3 5 4 6 2
 77     1 3 6 2 5 4
 78 
 79     4
 80     1 2 3 4
 81     1 2 4 3
 82     1 3 2 4
 83     1 3 4 2
 84     1 4 2 3
 85     1 4 3 2
 86     2 1 3 4
 87     2 1 4 3
 88     2 3 1 4
 89     2 3 4 1
 90     2 4 1 3
 91     2 4 3 1
 92     3 1 2 4
 93     3 1 4 2
 94     3 2 1 4
 95     3 2 4 1
 96     3 4 1 2
 97     3 4 2 1
 98     4 1 2 3
 99     4 1 3 2
100     4 2 1 3
101     4 2 3 1
102     4 3 1 2
103     4 3 2 1
104 
105     2 3 1 4
106     */

2.

一个序列,数x在第y个位置,第y个位置之后的小于x的数,必须是越往右越小。
即当前的最大数假设为z,则小于z的数必须是z-1,z-2,..,1。
 
时间上为O(n),但常数较大
 
  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <string>
  6 #include <algorithm>
  7 #include <iostream>
  8 using namespace std;
  9 #define ll long long
 10 
 11 const double eps=1e-8;
 12 const ll inf=1e9;
 13 const ll mod=1e9+7;
 14 const int maxn=1e5+10;
 15 
 16 int a[maxn];
 17 bool vis[maxn];
 18 
 19 int main()
 20 {
 21     int n,i,j;
 22     bool line=0;
 23     while (1)
 24     {
 25         scanf("%d",&n);
 26         if (n==0)
 27             break;
 28 
 29         if (!line)
 30             line=1;
 31         else
 32             printf("
");
 33 
 34         while (1)
 35         {
 36             scanf("%d",&a[1]);
 37             if (a[1]==0)
 38                 break;
 39             for (i=2;i<=n;i++)
 40                 scanf("%d",&a[i]);
 41 
 42             memset(vis,0,sizeof(vis));
 43             j=0;
 44             for (i=1;i<=n;i++)
 45             {
 46                 if (j>a[i])
 47                     break;
 48                 else if (j<=a[i])
 49                     j=a[i]-1;
 50 
 51                 vis[a[i]]=1;
 52                 while (vis[j])
 53                     j--;
 54             }
 55 
 56             if (i==n+1)
 57                 printf("Yes
");
 58             else
 59                 printf("No
");
 60         }
 61     }
 62     return 0;
 63 }
 64 /*
 65 6
 66 1 3 2 4 6 5
 67 1 4 3 5 2 6
 68 1 3 6 5 2 4
 69 5 4 3 2 1 6
 70 5 3 2 1 6 4
 71 1 3 5 4 6 2
 72 1 3 6 2 5 4
 73 
 74 8
 75 1 3 6 8 7 5 4 2
 76 
 77 4
 78 1 2 3 4
 79 1 2 4 3
 80 1 3 2 4
 81 1 3 4 2
 82 1 4 2 3
 83 1 4 3 2
 84 2 1 3 4
 85 2 1 4 3
 86 2 3 1 4
 87 2 3 4 1
 88 2 4 1 3
 89 2 4 3 1
 90 3 1 2 4
 91 3 1 4 2
 92 3 2 1 4
 93 3 2 4 1
 94 3 4 1 2
 95 3 4 2 1
 96 4 1 2 3
 97 4 1 3 2
 98 4 2 1 3
 99 4 2 3 1
100 4 3 1 2
101 4 3 2 1
102 
103 2 3 1 4
104 */

previous数组

一个数跳出,使用previous数组,这个数不再被使用

O(n)

1 3 2 6 5 4 9 8 7

previous[4] 0

previous[6] 6->5->4->0 0

previous[7] 7->6->0

极限数据

1 2 3 4 5 6 7 8 9

按照上述方法O(n^2)

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <string>
  6 #include <algorithm>
  7 #include <iostream>
  8 using namespace std;
  9 #define ll long long
 10 
 11 const double eps=1e-8;
 12 const ll inf=1e9;
 13 const ll mod=1e9+7;
 14 const int maxn=1e5+10;
 15 
 16 int a[maxn],pre[maxn];
 17 bool vis[maxn];
 18 
 19 int main()
 20 {
 21     int n,i,j,k;
 22     bool line=0;
 23     while (1)
 24     {
 25         scanf("%d",&n);
 26         if (n==0)
 27             break;
 28 
 29         if (!line)
 30             line=1;
 31         else
 32             printf("
");
 33 
 34         while (1)
 35         {
 36             scanf("%d",&a[1]);
 37             if (a[1]==0)
 38                 break;
 39             for (i=2;i<=n;i++)
 40                 scanf("%d",&a[i]);
 41 
 42             memset(vis,0,sizeof(vis));
 43             j=0;
 44             for (i=1;i<=n;i++)
 45             {
 46                 if (j>a[i])
 47                     break;
 48                 else if (j<=a[i])
 49                     j=a[i]-1,k=j;
 50 
 51                 vis[a[i]]=1;
 52                 while (vis[j])
 53                 {
 54                     if (pre[j])
 55                         j=pre[j];
 56                     else
 57                         j--;
 58                 }
 59                 if (j!=k)
 60                     pre[k]=j;
 61             }
 62 
 63             if (i==n+1)
 64                 printf("Yes
");
 65             else
 66                 printf("No
");
 67         }
 68     }
 69     return 0;
 70 }
 71 /*
 72 6
 73 1 3 2 4 6 5
 74 1 4 3 5 2 6
 75 1 3 6 5 2 4
 76 5 4 3 2 1 6
 77 5 3 2 1 6 4
 78 1 3 5 4 6 2
 79 1 3 6 2 5 4
 80 
 81 8
 82 1 3 6 8 7 5 4 2
 83 
 84 4
 85 1 2 3 4
 86 1 2 4 3
 87 1 3 2 4
 88 1 3 4 2
 89 1 4 2 3
 90 1 4 3 2
 91 2 1 3 4
 92 2 1 4 3
 93 2 3 1 4
 94 2 3 4 1
 95 2 4 1 3
 96 2 4 3 1
 97 3 1 2 4
 98 3 1 4 2
 99 3 2 1 4
100 3 2 4 1
101 3 4 1 2
102 3 4 2 1
103 4 1 2 3
104 4 1 3 2
105 4 2 1 3
106 4 2 3 1
107 4 3 1 2
108 4 3 2 1
109 
110 2 3 1 4
111 */
原文地址:https://www.cnblogs.com/cmyg/p/11110541.html