95分求助!

P1314 [NOIP2011 提高组] 聪明的质监员

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一下就可以过了


|