xzjxzjxzj @ 2023-08-21 23:46:03
这是蒟蒻不知道哪一步有问题的代码qwq
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long s;
int l[20005],r[20005];
int w[20005],v[20005];
long long pre_w[20005],pre_v[20005];
int maxx=-1,minn=0xfffffff;
long long sum;
bool check(int W)
{
long long Y=0;
sum=0;
memset(pre_w,0,sizeof(pre_w));//?
memset(pre_v,0,sizeof(pre_v));
for(int i=1;i<=n;i++)
{
if(w[i]>=W)
{
pre_w[i]=pre_w[i-1]+1;
pre_v[i]=pre_v[i-1]+v[i];
}
else
{
pre_w[i]=pre_w[i-1];
pre_v[i]=pre_v[i-1];
}
}
for(int i=1;i<=m;i++)
{
Y+=(pre_w[r[i]]-pre_w[l[i-1]])*(pre_v[r[i]]-pre_v[l[i-1]]);
}
sum=llabs(Y-s);//?
return Y>s;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
cin>>w[i]>>v[i];
maxx=max(maxx,w[i]);
minn=min(minn,w[i]);
}
for(int i=1;i<=m;i++)
{
cin>>l[i]>>r[i];
}
int left=minn-1,right=maxx+2;
long long ans=0x3f3f3f3f3f3f3f3f;
while(left<=right)
{
int mid=(left+right)/2;
if(check(mid))
{
left=mid+1;
}
else
{
right=mid-1;
}
ans=min(ans,sum);
}
cout<<ans<<endl;
return 0;
}
希望巨佬可以看看,蒟蒻跪谢!
by NPH_Zhao @ 2023-08-21 23:49:03
首先你的数组开小了,应该是200000
by NPH_Zhao @ 2023-08-21 23:51:38
其次没有看懂你的check函数中的sum有何作用捏
by NPH_Zhao @ 2023-08-21 23:56:31
最后你的差分写错了
应该是l[i] - 1而不是l[i - 1]
代码不要死记硬背ya,理解最重要的
AC
by xzjxzjxzj @ 2023-08-22 00:30:10
@NPH_Zhao 呃(汗 谢谢!
by xzjxzjxzj @ 2023-08-22 00:33:07
@NPH_Zhao sum我是看第一篇题解这样写,就是把Y-s绝对值先保存下来的一个变量 不过好像是没什么用捏(小声
by xzjxzjxzj @ 2023-08-22 00:33:52
@NPH_Zhao 嗯,谢谢巨佬!!