其他分享
首页 > 其他分享> > [2019牛客]第一场A Equivalent Prefixes

[2019牛客]第一场A Equivalent Prefixes

作者:互联网

题目链接

A:

给你两个长度为n的序列a、b,求一个最大k值使,i-k 中任意一个区间的最小值下标都相同

 

我们用单调栈处理每个元素作为最小值的左端点。

我们把下标放进栈中,比较的时候比较具体的值,维护一个值逐渐变大的单调栈。

若当前栈为空,则说明没有比当前值更小的元素,那么就从1开始。

其他就为 比当前值更小的元素下标+1

最后比较两个元素的左端点值是否相同就可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <map>
 8 #include <stack>
 9 #include <vector>
10 #include <cctype>
11 #include <sstream>
12 using namespace std;
13 typedef long long ll;
14 const int inf=0x7fffffff;
15 const int N=100000+100;
16 const int M=5000+10;
17 const double PI=acos(-1.0);
18 int T,n;
19 int a[N],b[N];
20 int A[N],B[N];
21 void solve(int t[],int a[])
22 {
23     stack<int>s;
24     for(int i=1;i<=n;i++)
25     {
26         while(s.size()&&a[s.top()]>a[i])
27             s.pop();
28         if(s.empty())   t[i]=1;
29         else    t[i]=s.top()+1;
30         s.push(i);
31     }
32 }
33 int main()
34 {
35         while(scanf("%d",&n)!=EOF)
36         {
37 
38         int ans=n+1;
39         for(int i=1;i<=n;i++)
40             scanf("%d",&a[i]);
41         for(int i=1;i<=n;i++)
42             scanf("%d",&b[i]);
43         solve(A,a);
44         solve(B,b);
45         for(int i=1;i<=n;i++)
46             if(A[i]!=B[i])
47             {
48                 ans=i;  break;
49             }
50         printf("%d\n",ans-1);
51         }
52 
53 
54 
55     return 0;
56 }
View Code

 

当时暴力了一种写法也过了。

每加入一个元素,判断加入这个元素对原本序列的影响。

也就是说加入一个元素下标为i,有影响的是 前面的询问 [i-1,i]  [i-2,i] [i-3,i].....

若 同一下标 a[x]和b[x]都大于当前元素 continue;

若 同一下标 a[x]和b[x]都小于当前元素 break;跳出这个循环,不用往前面看,前面的序列一定都满足条件

若 同一下标 a[x]和b[x] 一个大于当前元素,另一个小于当前元素 这个就不成立了。

这种情况在最坏的情况下是 O(n*n)

 

标签:下标,int,Equivalent,元素,Prefixes,牛客,当前,const,include
来源: https://www.cnblogs.com/Kaike/p/11249904.html