求助,扫描线+树状数组做法,码风极好
查看原帖
求助,扫描线+树状数组做法,码风极好
131591
蒟蒻君HJT泽渡透香楼主2022/3/2 22:53
#include <bits/stdc++.h>
using namespace std;
long long n,m,k,C[100005];
struct ed{
	long long rad,x,y;
}edge[200005];
inline bool cmp(ed a,ed b){
	return a.rad<b.rad;
}
inline long long lowbit(long long x){
	return x&-x;
}
inline void add(long long x,long long y){
	for(long long i=x;i<=100000;i+=lowbit(i))
		C[i]+=y;
	return ;
}
inline long long ask(long long x){
	long long ans=0;
	for(long long i=x;i;i-=lowbit(i))
		ans+=C[i];
	return ans;
}
inline long long Ask(){
	if(ask(1)<k) return 0;
	long long l=1,r=100000;
	while(l<r){
		long long mid=l+r+1>>1;
		if(ask(mid)>=k) l=mid;
		else r=mid-1;
	}
	return l;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	long long a1,a2,r;
	long long Ans=0,sum=0;
	for(long long i=1;i<=n;++i){
		scanf("%lld%lld%lld",&r,&a1,&a2);
		if(a1>a2) swap(a1,a2);
		edge[++sum].rad=a1,edge[sum].x=r,edge[sum].y=1,
		edge[++sum].rad=a2,edge[sum].x=r,edge[sum].y=-1;
	}
	sort(edge+1,edge+sum+1,cmp);
	long long t;
	for(int i=1;i<=sum;++i){
		add(1,edge[i].y);
		if(edge[i].x<100000) add(edge[i].x+1,-edge[i].y);
		t=Ask();
		if(i<sum) Ans+=(t*t*(edge[i+1].rad-edge[i].rad));
	}
	printf("%lld\n",Ans);
	return 0;
}

现在问题是一直WA10分,细节我也都检查过了,自己造了样例了,但是不行

2022/3/2 22:53
加载中...