[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