题意:给定两个长度为n得1-n的全排列数串 A B
找到最大的ans 使得1-ans之间 所有l r属于这个区间的(l<=r) 均满足 区间最小值的下标相等
假设前m个已经维护好了 现在加入第m+1个数
如果最近的小于第m+1个数的下标相等 那么即成立 用栈维护
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) typedef pair<int,int>pii; ////////////////////////////////// const int N=1e5+10; stack<pii>sta,stb; int a[N],b[N],n; int sol(){ while(!sta.empty())sta.pop(); while(!stb.empty())stb.pop(); rep(i,1,n)RI(a[i]); rep(i,1,n)RI(b[i]); rep(i,1,n){ while(!sta.empty()&&sta.top().first>a[i])sta.pop(); while(!stb.empty()&&stb.top().first>b[i])stb.pop(); if(sta.empty()&&stb.empty())sta.push(make_pair(a[i],i)),stb.push(make_pair(b[i],i)); else if(!sta.empty()&&!stb.empty()&&sta.top().second==stb.top().second)sta.push(make_pair(a[i],i)),stb.push(make_pair(b[i],i)); else return i-1; } return n; } int main() { while(~RI(n))printf("%d ",sol()); return 0; }