萌新刚学OI,树状数组RE 70pts
查看原帖
萌新刚学OI,树状数组RE 70pts
232900
Dolphin20080317楼主2021/8/25 23:48

RE三个点

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL k,cnt,cnt1,ans;
struct data{
	LL l,r;
};
data a[100005];
int val[100005],num[100005];
LL b[100005],d[100005],rankk[100005],tree[100005];
LL find(LL x){
	LL l=0,r=cnt1;
	while(l<=r){
		LL mid=(l+r)>>1;
		if(val[mid]>x) r=mid-1;
		if(val[mid]==x) return mid;
		if(val[mid]<x) l=mid+1;
	}
}
void add(LL x,LL k){
	for(;x<=cnt1;x+=(x&-x)) tree[x]+=k;
}
LL sum(LL x){
	LL tmpp=0;
	for(;x>0;x-=(x&-x)) tmpp+=tree[x];
	return tmpp;
}
int main(){
    scanf("%lld",&k);
    for(LL i=1;i<=k;i++){
    	scanf("%lld%lld",&a[i].l,&a[i].r);
    	if(d[a[i].l]==0) b[++cnt]=a[i].l,d[a[i].l]=1;
    	if(d[a[i].r]==0) b[++cnt]=a[i].r,d[a[i].r]=1;
	}
	sort(b+1,b+cnt+1);
    cnt1=0;
	for(LL i=0;i<=cnt;i++){
		val[cnt1]=b[i];
		num[cnt1++]=1;
		if(b[i+1]>b[i]+1){
			val[cnt1]=b[i]+1;
		    num[cnt1++]=b[i+1]-b[i]-1;
	    }
	}
	cnt1--;
	for(LL i=1;i<=cnt1;i++) rankk[i]=i;//离散化 
	for(LL i=1;i<=k;i++){
		LL x=find(a[i].l),y=find(a[i].r);
		swap(rankk[x],rankk[y]);
		swap(num[x],num[y]);
	}
	for(LL i=cnt1;i>=1;i--){
	    ans+=1LL*sum(rankk[i]-1)*num[i];
		add(rankk[i],num[i]);
		
	}
	printf("%lld",ans);
	return 0;
}
2021/8/25 23:48
加载中...