LOADING

加载过慢请开启缓存,浏览器默认开启

daily 1

2023/3/23 daily

CF 540E

树状数组+离散化+思维

首先如果交换序列之间没有数,那么就很好求,现在我们考虑不属于交换序列内的数

我们假定当前位置为i,p[i]为该位置一开始的位置 f[i]为离散化后i的值

那么我们先加上交换序列的逆序对

然后加上之间数的逆序对,再减去交换序列里的逆序对

abs(f[i]-f[p[i]])+1-(abs(i-p[i])+1)

然后就ok了

#define lowbit(x) x&-x
void solve(){
  int n;cin>>n;
  vector<int>l(n+1),r(n+1),pre_pos,pre_value;
  map<int,int>mp;
  for(int i=1;i<=n;++i){
    cin>>l[i]>>r[i];
    mp[l[i]]=0;
    mp[r[i]]=0;
  }
  int cnt=0;
  pre_pos.push_back(0);
  pre_value.push_back(0);
  for(auto& k:mp){
    k.second=++cnt;
    pre_pos.push_back(cnt);
    pre_value.push_back(k.first);
  }
  vector<int>tree(cnt+1);
  for(int i=1;i<=n;++i){
    l[i]=mp[l[i]];
    r[i]=mp[r[i]];
  }
  auto add=[&](int x,int v){
    while(x<=cnt){
        tree[x]+=v;
        x+=lowbit(x);
    }
  };
  auto sum=[&](int x){
    ll ans=0;
    while(x){
        ans+=tree[x];
        x-=lowbit(x);
    }
    return ans;
  };
  for(int i=1;i<=n;++i){
    swap(pre_pos[l[i]],pre_pos[r[i]]);
  }
  ll ans=0;
  for(int i=1;i<=cnt;++i){
    add(pre_pos[i],1);
    ans+=i-sum(pre_pos[i]);
    ans+=(abs(pre_value[i]-pre_value[pre_pos[i]])-abs(i-pre_pos[i]));
  }
  cout<<ans<<'\n';
  return;
}

下午做点某讯的面试题吧,今天上午面了tx一面,感觉还挺好的