参考资料:
[1]:官方题解(提取码:t050 )
[2]:标程(提取码:rvxr )
[3]:牛客题解汇总
A.Equivalent Prefixes(单调栈)
•题意
定义两个数组 u,v ,并且 u,v 都含有 m 个互不相同的元素;
如果数组 u,v 任意区间的RMQ(区间最小值)对应的下标都相等,则说这两个数组是 "equivalent";
先给你包含 n 个不同元素的数组 a,b,求使得 $a[1,2,...,p]$ 与 $b[1,2,....,p]$ 为 "equivalen" 的最大的 p;
•题解
定义数组 L1,L1[ i ]表示在 a 数组中,以 ai 为区间最小值最左可以到达的位置;
即 RMQ( L1[ i ], i ) = ai;
定义数组 L2,含义与 L1 相同,作用于数组 b;
对于位置 i ,找到第一个不满足 L1[i] == L2[ i ] 的位置 i,那么,答案就为 i-1;
•Code
View Code1 #include<iostream> 2 #include<cstdio> 3 #include<stack> 4 using namespace std; 5 #define ll long long 6 const int maxn=1e5+50; 7 8 int n; 9 int a[maxn]; 10 int b[maxn]; 11 int L1[maxn]; 12 int L2[maxn]; 13 stack<int >sta; 14 15 void Work(int *a,int *L) 16 { 17 while(!sta.empty()) 18 sta.pop(); 19 for(int i=1;i <= n;++i) 20 { 21 while(!sta.empty() && a[sta.top()] >= a[i]) 22 sta.pop(); 23 24 L[i]=sta.empty() ? 1:sta.top()+1; 25 sta.push(i); 26 } 27 } 28 int Solve() 29 { 30 Work(a,L1); 31 Work(b,L2); 32 33 int p=n; 34 for(int i=1;i <= n;++i) 35 if(L1[i] != L2[i]) 36 { 37 p=i-1; 38 break; 39 } 40 return p; 41 } 42 int main() 43 { 44 while(~scanf("%d",&n)) 45 { 46 for(int i=1;i <= n;++i) 47 scanf("%d",a+i); 48 for(int i=1;i <= n;++i) 49 scanf("%d",b+i); 50 51 printf("%d\n",Solve()); 52 } 53 return 0; 54 }