50pts,WA,TLE,求调
查看原帖
50pts,WA,TLE,求调
1368189
znzryb楼主2024/8/11 22:12

TLE我知道可能要用前缀和,但求各位大佬帮我看看我的程序为什么会WA。只要回复我都会关注,求求了。

#include <iostream>
#include <cmath>
#include <algorithm>
// https://www.luogu.com.cn/problem/P1314
// 计数(大于W)乘以价值总和(也是大于W的) 
using namespace std;
long long int const MAXNM=200010;
long long int n,m,s,wei_val[MAXNM][2],ll_rr[MAXNM][2],l,r,cnt,sum_val,sum_yi,max_weigh,mid,ans,ll,rr;

bool check(long long int W){
	sum_yi=0;
	for(long long int i=0;i<n;i++){
		ll=ll_rr[i][0];rr=ll_rr[i][1];		// 模拟题目流程计算检验结果 
		sum_val=0;cnt=0;
		for(long long int j=ll-1;j<=rr-1;j++){
			if(wei_val[j][0]>=W){
				cnt+=1;
				sum_val+=wei_val[j][1]; 
			}
		}
		sum_yi+=cnt*sum_val;
	}
	if(sum_yi>=s){
		return true;
	}else{
		return false;
	}
}
long long int differ_s(long long int W){
	sum_yi=0;
	for(long long int i=0;i<m;i++){
		ll=ll_rr[i][0];rr=ll_rr[i][1];		// 模拟题目流程计算检验结果 
		sum_val=0;cnt=0;
		for(long long int j=ll-1;j<=rr-1;j++){
			if(wei_val[j][0]>=W){
				cnt+=1;
				sum_val+=wei_val[j][1]; 
			}
		}
		sum_yi+=cnt*sum_val;
	}
	return abs(sum_yi-s);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>s;
	for(long long int i=0;i<n;i++){
		cin>>wei_val[i][0]>>wei_val[i][1];
		max_weigh=max(max_weigh,wei_val[i][0]);
	}
	for(long long int i=0;i<m;i++){
		cin>>ll_rr[i][0]>>ll_rr[i][1];
	}
	l=0;r=max_weigh;
	while(l<=r){
		mid=l+(r-l)/2;
		if(check(mid)){		// 筛选可能太松,致使sum_yi>s,w再加一点,严格筛选 
			ans=mid;
			l=mid+1;
		}else{
			r=mid-1; 
		}
	}
			// 我得到的ans一定是能让偏差为正时最小的,但还要验证偏差为负时是否会更小 
	cout<<min(differ_s(ans),differ_s(ans+1));
}

// 一个都没过 悲 https://www.luogu.com.cn/record/172075471
// 50pts https://www.luogu.com.cn/record/172078808
2024/8/11 22:12
加载中...