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