zyzbldnb @ 2023-01-10 18:14:15
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=200005;
int n,m,l[maxn],r[maxn];
ll a[maxn],sv[maxn],sw[maxn],v[maxn],w[maxn],b[maxn],s,W;
int main()
{
cin>>n>>m>>s;W=s;
int start=1,end=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]); // a w,b val
if(a[i]>end) end=a[i];
}
for(int i=1;i<=m;i++)
cin>>l[i]>>r[i];
while(start<end) {
ll y=0;
int mid=(start+end)>>1;
memset(sv,0,sizeof(sv));
memset(sw,0,sizeof(sw));
memset(w,0,sizeof(sv));
memset(v,0,sizeof(sw));
for(int j=1;j<=n;j++){
if(a[j]>=mid) {w[j]=1;v[j]=b[j];}
else {w[j]=0;v[j]=0;}
sv[j]=sv[j-1]+v[j];
sw[j]=sw[j-1]+w[j];
}
for(int i=1;i<=m;i++)
y+=(sv[r[i]]-sv[l[i]-1])*(sw[r[i]]-sw[l[i]-1]);
if(y==s){W=0; break;}
W=min(W,abs(y-s));
if(s>y) // y小了,W 大
end=mid;
else if(y>s)
start=mid+1;
}
cout<<W;
return 0;
}
```cpp
by Marrelia @ 2023-10-11 06:26:03
应该是在二分之前++end一下就可以过了