95分求助!
查看原帖
95分求助!
714900
zyzbldnb楼主2023/1/10 18:14
#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
2023/1/10 18:14
加载中...