CF540E
题解:这一题做了将近4个小时,看网上的博客,都是简单带过。
找了两个写得好的博客,帮助大家理解一下。
https://www.cnblogs.com/FinFin/p/9727351.html
https://blog.csdn.net/u011580493/article/details/45461549
代码:
#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
typedef long long ll;
int n,val[N<<1],a[N],b[N],sum[N<<1],num[N<<1],tot,d[N<<1]; //记得开两倍,RE了一次
int lowbit(int x){return x&-x;}
void add(int i,int x){
while(i <= tot){
d[i] += x;
i += lowbit(i);
}
}
int query(int i){
int sum = 0;
while(i){
sum += d[i];
i -= lowbit(i);
}
return sum;
}
int main(){
scanf("%d",&n);
tot = 0;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
num[++tot] = a[i], num[++tot] = b[i];
}
sort(num+1,num+1+tot);
tot = unique(num+1,num+1+tot) - (num+1);
for(int i=1;i<=tot;i++) sum[i] = sum[i-1] + num[i] - num[i-1] - 1;
for(int i=1;i<=tot;i++) val[i] = lower_bound(num+1,num+1+tot,num[i]) - num;
for(int i=1;i<=n;i++){
int k1 = lower_bound(num+1,num+1+tot,a[i]) - num;
int k2 = lower_bound(num+1,num+1+tot,b[i]) - num;
swap(val[k1],val[k2]);
}
ll ans = 0;
memset(d,0,sizeof(d));
for(int i=1;i<=tot;i++){
ans += (ll)(query(tot)-query(val[i]));
ans += (ll)abs(sum[val[i]] - sum[i]);
add(val[i],1);
}
printf("%lld\n",ans);
}