求大佬棒棒忙啊,T了两个WA一个。

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

_Lemon_ @ 2017-10-01 18:08:09

#include<bits/stdc++.h>
using namespace std;
int w[200005],v[200005],n,m,nnd[200005][3];
long long s,all[200005],num[200005],k,ans=300000000000;
int check(int mid)
{
    memset(all,0,sizeof(all));
    memset(num,0,sizeof(num));
    k=0;
    for(int i=1;i<=n;i++)
      if(w[i]>=mid)  { all[i]=all[i-1]+v[i];  num[i]=num[i-1]+1;}
      else { all[i]=all[i-1];  num[i]=num[i-1];}
    for(int i=1;i<=m;i++)
      {
             int tot=all[nnd[i][2]]-all[nnd[i][1]-1];
             int sum=num[nnd[i][2]]-num[nnd[i][1]-1];
             k+=tot*sum;
      }
    ans=min(ans,abs(k-s));
    if(k>s) return 1;
     else if(k<s) return 0;
         else if(k==s) return 2;
}
int main()
{
//      cout<<ans<<endl;
      int i,j,r=0,l=300000000000;
      cin>>n>>m>>s;
      for(i=1;i<=n;i++)
      {
        scanf("%d%d",&w[i],&v[i]);
        if(w[i]>r) r=w[i];
        if(w[i]<l) l=w[i];
      }
      for(i=1;i<=m;i++)
      {
        scanf("%d%d",&nnd[i][1],&nnd[i][2]);
         if(nnd[i][1]>nnd[i][2])  swap(nnd[i][1],nnd[i][2]);
      }
      while(l<r)
      {
          int mid=(l+r)/2;
          int w=check(mid);
          if(w==1)  l=mid+1;
        else    if(w==0)  r=mid;
             else {
                          cout<<0; 
                       return 0;
                  }
      }
      cout<<ans; 
      return 0;
}

|