题意:
输入俩个序列,rmq(w,l,r)表示w序列从al到ar的最小值的下标 。
题目要求输出最大的r,且要求区间1到r的rmq(w,l,r) == rmq(v,l,r)对任意的1到r的子串都相等题解:
定义俩个stack,从1到n,分别插入俩个队列的元素,始终维护这俩个stack的队首元素是以当前元素的最小的元素,如果俩个stack的大小不一样,就输出i-1,如果没有,输出n。
准确的说stack的size是从1到当前值距离最小值的距离。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[100010],b[100010];
int main()
{
int n;
while(cin>>n&&n)
{
int flag = 0,ans = 0;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
stack<int> s1,s2;
for(int i=1;i<=n;i++)
{
while(!s1.empty() && s1.top() > a[i])
s1.pop();
while(!s2.empty() && s2.top() > b[i])
s2.pop();
s1.push(a[i]),s2.push(b[i]);
if(s1.size() != s2.size()){
flag = 1;
ans = i-1;
}
if(flag)
break;
}
if(flag){
cout<<ans<<endl;
}else{
cout<<n<<endl;
}
}
return 0;
}

京公网安备 11010502036488号