noip day2 聪明的质检员

今天做了一道noip的题目

首先第一眼看出可用二分,因为此题具有单调性(自己画图像证明);

1,打了个裸的,对了6个。

后来在欧少的提醒下写了前缀和,

然后附上欧少的代码————————个人的有点丑就不发了

var
        n,m,ss,ans,min:int64;
        j:longint;
        g,s,w,v,q,p:array[-1..200010] of int64;
        l,r,fk:int64;



begin
        readln(n,m,ss);
        for j:=1 to n do
        readln(w[j],v[j]);
        for j:=1 to m do
        readln(p[j],q[j]);
        l:=0; r:=1000000000; min:=-1;
        while r>l do
        begin
                fk:=(l+r)div 2; g[0]:=0; s[0]:=0; ans:=0;
                for j:=1 to n do
                 if w[j]>=fk then begin g[j]:=g[j-1]+1; s[j]:=s[j-1]+v[j]; end
                 else begin g[j]:=g[j-1]; s[j]:=s[j-1]; end;
                for j:=1 to m do
                        ans:=ans+(g[q[j]]-g[p[j]-1])*(s[q[j]]-s[p[j]-1]);
                if ((min=-1)or(abs(ans-ss)<min)) then min:=abs(ans-ss);
                if ans>ss then l:=fk+1 else r:=fk;
        end;
        writeln(min);
end.                                
posted on 2012-10-12 22:26  weekend1997  阅读(756)  评论(0)    收藏  举报