两份代码,一份全WA,一份AC,求解
查看原帖
两份代码,一份全WA,一份AC,求解
702258
Yangbowen0108楼主2023/6/17 20:27

AC代码

#include<bits/stdc++.h>
#define ll long long
#define N 200010
using namespace std;
int l[N],r[N],n,m,w[N],v[N],x=1,y;
ll mid,num,sv[N],sw[N],ans,s;
int main(){
	scanf("%d%d%lld",&n,&m,&s);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&w[i],&v[i]);
		y=max(y,w[i]);
	}
	for(int i=1;i<=m;i++)
		scanf("%d%d",&l[i],&r[i]);
	ans=s,y++;
	while(x<y){
		memset(sv,0,sizeof(sv));
		memset(sw,0,sizeof(sw));
		mid=(x+y)/2;
		num=0;
		for(int i=1;i<=n;i++){
			if(w[i]>=mid){
				sw[i]=sw[i-1]+1;
				sv[i]=sv[i-1]+v[i];
			}
			else{
				sw[i]=sw[i-1];
				sv[i]=sv[i-1];
			}
		}
		for(int i=1;i<=m;i++)
			num+=(sw[r[i]]-sw[l[i]-1])*(sv[r[i]]-sv[l[i]-1]);
		if(num==s){
			num=0;
			break;
		}
		ans=min(ans,abs(num-s));
		if(num<=s)y=mid;
		else x=mid+1;
	}
	printf("%lld",ans);
	return 0;
}

全WA代码

#include<bits/stdc++.h>
#define ll long long
#define N 200010
using namespace std;
ll n,m,mid,num,x=1,y,l[N],r[N],w[N],v[N],sv[N],sw[N],ans,s;
int main(){
	scanf("%lld%lld%lld",&n,&m,&s);
	for(int i=1;i<=n;i++){
		scanf("%lldlld",&w[i],&v[i]);
		y=max(y,w[i]);
	}
	for(int i=1;i<=m;i++)
		scanf("%lld%lld",&l[i],&r[i]);
	ans=s,y++;
	while(x<y){
		memset(sv,0,sizeof(sv));
		memset(sw,0,sizeof(sw));
		mid=(x+y)/2;
		num=0;
		for(int i=1;i<=n;i++){
			if(w[i]>=mid){
				sw[i]=sw[i-1]+1;
				sv[i]=sv[i-1]+v[i];
			}
			else{
				sw[i]=sw[i-1];
				sv[i]=sv[i-1];
			}
		}
		for(int i=1;i<=m;i++)
			num+=(ll)(sw[r[i]]-sw[l[i]-1])*(sv[r[i]]-sv[l[i]-1]);
		if(num==s){
			num=0;
			break;
		}
		ans=min(ans,abs(num-s));
		if(num<=s)y=mid;
		else x=mid+1;
	}
	printf("%lld",ans);
	return 0;
}

求dalao解答

2023/6/17 20:27
加载中...