CF540E:树状数组+离散化

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);
}

 

posted @ 2019-02-15 19:49  月光下の魔术师  阅读(11)  评论(0)    收藏  举报