bzoj 1271 二分

来源:互联网 发布:乌海四中网络选课系统 编辑:程序博客网 时间:2024/06/15 13:40

题意:

首先,数据不保证总人数不大于10^8,所以要开long long(mdzz,被坑了好几个wa)

题目保证最多有且只有一个位置是奇数,所以很显然会想到奇数+偶数=奇数

对于x处的人数维护一个前缀和

那么我们就二分这个奇数的位置,从这个位置往后(包括这个位置)的前缀和都是奇数,这个位置之前(不包含这个位置)的前缀和都是偶数

每个小组贡献的人数为 min(x-s[i],e[i]-s[i])  / d[i] +1

var        n,t             :longint;        i               :longint;        l,r,mid,ans     :int64;        s,e,d           :array[0..200010] of longint;function min(a,b:longint):longint;begin   if a<b then exit(a) else exit(b);end;function get_sum(x:int64):int64;var        tt:int64;begin   tt:=0;   for i:=1 to n do     if s[i]<=x then inc(tt,min(x-s[i],e[i]-s[i]) div d[i]+1);   exit(tt);end;function check(x:int64):boolean;var        tt:int64;begin   tt:=get_sum(x);   if tt and 1=1 then exit(true) else exit(false);end;begin   read(t);   while (t>0) do   begin      dec(t);      read(n);      for i:=1 to n do read(s[i],e[i],d[i]);      l:=0; r:=maxlongint; ans:=0;      while (l<=r) do      begin         mid:=(l+r)>>1;         if check(mid) then         begin            ans:=mid; r:=mid-1;         end else l:=mid+1;      end;      if ans=0 then writeln('Poor QIN Teng:(')        else writeln(ans,' ',get_sum(ans)-get_sum(ans-1));   end;end.
——by Eilys

0 0
原创粉丝点击