B. Swaps
作者:互联网
很明显,第一位肯定是能比较出大小的
然后1 换a过来,2 换b过来 3 a也换b也换
法1
当时的乱搞写法
存下位置,排序值,st表找合适值域中位置最小值
int n,a[N],lg[N],minn[N][50],ans; struct node { int val; int pos; bool operator<(const node &rhs)const{ return val<rhs.val; } }b[N]; void solve(){ lg[0]=-1; ans=inf; scanf("%lld",&n); for(int i=1;i<=n;++i)scanf("%lld",&a[i]); for(int i=1;i<=n;++i){ lg[i]=lg[i/2]+1; scanf("%lld",&b[i].val); b[i].pos=i; } sort(b+1,b+1+n); for(int i=1;i<=n;i++){ minn[i][0]=b[i].pos; } for(int i=1;i<=lg[n];i++){ for(int j=1;j+(1<<i)-1<=n;j++){ minn[j][i]=min(minn[j][i-1],minn[j+(1<<(i-1))][i-1]); } } for(int i=1;i<=n;i++){ int l=(a[i]+1)/2; int r=n; int len=lg[r-l+1]; ans=min(ans,i-2+min(minn[l][len],minn[r-(1<<(len))+1][len])); } printf("%lld\n",ans); }
法2
按ai的值上升,找合适的bi
类似于单调栈的感觉
对于ai值从小到大,bi的位置一定是单调上升的
证明
假设当前ai值 为 x 找到 b的pos为合适
若bpos 小于x + 2 pos后移
若bpos 大于x + 2 pos不变
假设pos点不是最优的,pos位置前存在 pos‘ 使得 bpos’ 大于 bpos
根据前面的移动规则, 指针不会移动到pos位置,因为 bpos’ 大于 bpos 大于 ai 指针会停留在pos‘
得到pos点最优
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i]; int ans = n; for(int i=1, j=0;i<2*n;i+=2) { while(b[j]<i) j++; c[i] = j; } for(int i=0;i<n;i++) ans = min(ans, c[a[i]]+ i);
标签:Swaps,int,位置,pos,bpos,ai,大于 来源: https://www.cnblogs.com/PdrEam/p/15317977.html