判断序列第i个数是否满足题目要求的条件是:找出这个数左边比它小的数中最靠近它的那个数的位置,如果两个序列所找的位置相同,则第i个数满足条件。
我是用优先队列写的。
#include<bits/stdc++.h> #define sc(x) scanf("%d",&x) #define scl(x) scanf("%lld",&x) #define ll long long using namespace std; int a[110000]; int b[110000]; int s1[110000]; int s2[110000]; int c1[110000]; int c2[110000]; priority_queue<int>q1; priority_queue<int>q2; int main() { int n; while(~scanf("%d",&n)) { memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(int i=1;i<=n;i++) { sc(a[i]); c1[a[i]]=i; } for(int i=1;i<=n;i++) { sc(b[i]); c2[b[i]]=i; } q1.push(a[n]); for(int i=n-1;i>0;i--) { while(!q1.empty()&&a[i]<q1.top()) { int t=q1.top(); s1[t]=a[i]; q1.pop(); } q1.push(a[i]); } while(!q1.empty())q1.pop(); q2.push(b[n]); for(int i=n-1;i>0;i--) { while(!q2.empty()&&b[i]<q2.top()) { int t=q2.top(); s2[t]=b[i]; q2.pop(); } q2.push(b[i]); } while(!q2.empty())q2.pop(); int ans=1; for(int i=2;i<=n;i++) { int d1=s1[a[i]]; int d2=s2[b[i]]; if(c1[d1]!=c2[d2])break; ans++; } printf("%d\n",ans); } return 0; }