求各位红名巨佬帮帮我
二分+前缀和,时间不超了,听取WA声一片
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200005;
ll n, m, maxx;
ll s, y, ans, res=0x3f3f3f3f;
struct node
{
ll w, v;
} a[N];
struct qj
{
ll s, e;
} b[N];
ll sn[N],sv[N];
ll minn;
bool count(ll W)
{
ans = 0;
memset(sn,0,sizeof(sn));
memset(sv,0,sizeof(sv));
for(int i=1;i<=n;i++){
if(a[i].w>=W){
sn[i]=sn[i-1]+1;
sv[i]=sv[i-1]+a[i].v;
}
else{
sn[i]=sn[i-1];
sv[i]=sv[i-1];
}
}
for (ll i = 1; i <= m; i++)
{
ll st=b[i].s,en=b[i].e;
ans+=(sn[en]-sn[st-1])*(sv[en]-sv[st-1]);
}
res=min(res,llabs(ans-s));
return ans>s;
}
int main()
{
scanf("%d%d%lld", &n, &m, &s);
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i].w, &a[i].v);
maxx = max(maxx, a[i].w);
}
for (int i = 1; i <= m; i++)
scanf("%d%d", &b[i].s, &b[i].e);
ll l = 1, r = maxx, mid;
while (l <= r)
{
mid = (l+r) / 2;
if (count(mid))
l=mid+1;
else
r=mid-1;
}
printf("%d",res);
}