ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poj1363 Rails Central Europe 1997

2019-06-30 17:53:43  阅读:246  来源: 互联网

标签:Europe Central 1997 int ll maxn const line include


 

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("\n");
 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\n");
 63                 else
 64                     printf("No\n");
 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("\n");
 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\n");
 58             else
 59                 printf("No\n");
 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("\n");
 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\n");
 65             else
 66                 printf("No\n");
 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 */

 

标签:Europe,Central,1997,int,ll,maxn,const,line,include
来源: https://www.cnblogs.com/cmyg/p/11110541.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有