其他分享
首页 > 其他分享> > B. Swaps

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  大于 a指针会停留在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