聪明质检员

题目链接:https://www.luogu.com.cn/problem/P1314

题意:

m个区间,规定一个值W,对于每个区间进行有条件约束的求和得到y,求最小的s-y绝对值

思路:

由于查询的区间和数组本身是分离的,所以不能排序数组,然后二分查找!

其实就是二分答案(发现mid和y单调性相关,mid越大,y越小,mid越小,y越大),然后每次都进行相关前缀和预处理处理

时间复杂度O(m*logn)

struct node{
	int l,r;
	bool operator<(const node&a)const{
		return l<a.l;
	}
};
node a[maxn];
ll pre[maxn];
node interval[maxn];
ll s,n,m;
ll ans=llmax;
ll prex[maxn];
bool check(int mid){
	ll y=0,nums=0,sum=0;
	for(int i=1;i<=n;i++)prex[i]=prex[i-1]+(a[i].l>=mid?1:0);
	for(int i=1;i<=n;i++)pre[i]=pre[i-1]+(a[i].l>=mid?a[i].r:0);
	
	for(int i=1;i<=m;i++){
		int l=interval[i].l,r=interval[i].r;
		nums=prex[r]-prex[l-1];
		sum=pre[r]-pre[l-1];
		y+=nums*sum;	
	}
	ans=min(ans,abs(y-s));
	if(y>s)return true;
	return false;
}

void solve(){
	cin>>n>>m;cin>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
	}
	
	
	for(int i=1;i<=m;i++){
		cin>>interval[i].l>>interval[i].r;
	}
	int l=0,r=1e16;
	
	while(l<=r){
		int m=l+r>>1;
		if(check(m)){
			l=m+1;
		}else{
			r=m-1;
		}
	}

	cout<<ans<<endl;
}
``u
posted @ 2025-03-18 18:45  Marinaco  阅读(31)  评论(0)    收藏  举报
//雪花飘落效果