您的位置:首页 > 其它

NOIP提高组2011 聪明的质检员

2016-11-01 19:23 295 查看
二分答案+前缀和优化。
注意INF要开的大一点........

#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long

const LL N=222222;
const LL INF=12345678912340;

struct Node
{
LL l;
LL r;
}a
;

LL wei
,num
,v
,w
;
LL n,m,S,r,l,mid,now,as;

LL max(LL A,LL B)
{
return A>B? A:B;
}

LL min(LL A,LL B)
{
return A>B? B:A;
}

LL W(LL k)
{
wei[0]=0;num[0]=0;
for (LL i=1;i<=n;i++)
if (w[i]>=k) num[i]=num[i-1]+1,wei[i]=wei[i-1]+v[i];
else num[i]=num[i-1],wei[i]=wei[i-1];
LL sum=0;
for (LL i=1;i<=m;i++)
sum=sum+(wei[a[i].r]-wei[a[i].l-1])*(num[a[i].r]-num[a[i].l-1]);
return S-sum;
}

int main()
{
scanf("%lld%lld%lld",&n,&m,&S);
r=-INF;
l=INF;
for (LL i=1;i<=n;i++) scanf("%lld%lld",&w[i],&v[i]),l=min(l,w[i]),r=max(r,w[i]);
for (LL i=1;i<=m;i++)
scanf("%lld%lld",&a[i].l,&a[i].r);
as=INF;
while (l<=r)
{
mid=(l+r)>>1;
now=W(mid);
as=min(as,abs(now));
if (now<0) l=mid+1;
else if (now>0) r=mid-1;
else
{
as=0;
break;
}
}
printf("%lld",as);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: