题解
2023-03-17 22:26:41
发布于:上海
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long s;//s比较大,要用ll,不然会爆
int num[200010];//num[i]代表前i个中符合条件的矿石数目
long long sum[200010];//代表前i个矿石的价值和
int L[200010],R[200010];//存每个检验区间
struct ks
{
int v;
int w;
}a[200010];//结构体
long long pd(int w)
{
memset(num,0,sizeof(num));//初始化
memset(sum,0,sizeof(sum));
long long k=0;
for(int i=1;i<=n;i++)
{
if(a[i].w>=w)//这里ifelse可以并成两个式子,不过看起来难受,用了比较一般的方法
{
num[i]=num[i-1]+1;
sum[i]=sum[i-1]+a[i].v;
}
else
{
num[i]=num[i-1];
sum[i]=sum[i-1];
}
}
for(int i=0;i<m;i++)
{
k+=(num[R[i]]-num[L[i]-1])*(sum[R[i]]-sum[L[i]-1]);//右边是每个区间的检验值,-1不要漏
}
return k;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++)cin>>a[i].w>>a[i].v;//读入数据
for(int i=0;i<m;i++)cin>>L[i]>>R[i];
int l=0,r=1000010,mid;
long long ss,ans=1000000000010;//ans初值要大
while(l<=r)
{
mid=(l+r)/2;
ss=pd(mid);
ans=min(ans,abs(ss-s));
if(ss<s)r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
return 0;
}
这里空空如也
有帮助,赞一个