【CF725D】Contest Balloons(贪心,堆)

题意:acm队伍可以得气球,相同气球数是一个排名。每个队伍有一个气球数上限,如果该队伍的气球数大于上限

        该队伍被淘汰。给了你队伍的气球数,你的气球可以给别人,问你最大可能的排名。

        (2 ≤ n ≤ 300 000) (0 ≤ ti ≤ wi ≤ 10^18)

思路:对每个初始t[i]>t[1]的i,将w[i]-t[i]+1放入小根堆中

        开始给气球,将给出气球后大于当前气球数的组的w[i]-t[i]+1继续放入堆中

        记录给后名次的最小值即可

  1 const oo=2000000000000000000;
  2 var q,a,b,c,d:array[1..310000]of int64;
  3 
  4     n,m,i,ans,t,w:longint;
  5     s:int64;
  6 
  7 procedure swap(var x,y:int64);
  8 var t:int64;
  9 begin
 10  t:=x; x:=y; y:=t;
 11 end;
 12 
 13 procedure qsort(l,r:longint);
 14 var i,j:longint;
 15     mid1,mid2,mid3:int64;
 16 begin
 17  i:=l; j:=r; mid1:=a[(l+r)>>1]; mid2:=b[(l+r)>>1]; mid3:=c[(l+r)>>1];
 18  repeat
 19   while (mid1<a[i])or(mid1=a[i])and(mid2>b[i])or
 20         (mid1=a[i])and(mid2=b[i])and(mid3>c[i]) do inc(i);
 21   while (mid1>a[j])or(mid1=a[j])and(mid2<b[j])or
 22         (mid1=a[j])and(mid2=b[j])and(mid3<c[j]) do dec(j);
 23   if i<=j then
 24   begin
 25    swap(a[i],a[j]); swap(b[i],b[j]); swap(c[i],c[j]);
 26    inc(i); dec(j);
 27   end;
 28  until i>j;
 29  if l<j then qsort(l,j);
 30  if i<r then qsort(i,r);
 31 end;
 32 
 33 function min(x,y:longint):longint;
 34 begin
 35  if x<y then exit(x);
 36  exit(y);
 37 end;
 38 
 39 procedure shiftup(x,m:longint);
 40 begin
 41  while (x>1)and(q[x]<q[x>>1]) do
 42  begin
 43   swap(q[x],q[x>>1]);
 44   x:=x>>1;
 45  end;
 46 end;
 47 
 48 procedure shiftdown(x,m:longint);
 49 var t:longint;
 50 begin
 51  while (x<<1)<=m do
 52  begin
 53   t:=x<<1;
 54   if (t+1<=m)and(q[t]>q[t+1]) then t:=t+1;
 55   if q[x]>q[t] then
 56   begin
 57    swap(q[x],q[t]);
 58    x:=t;
 59   end
 60    else break;
 61  end;
 62 end;
 63 
 64 begin
 65  //assign(input,'cf725D.in'); reset(input);
 66  //assign(output,'cf725D.out'); rewrite(output);
 67  readln(n);
 68  for i:=1 to n do
 69  begin
 70   read(a[i],b[i]);
 71   c[i]:=i;
 72  end;
 73  qsort(1,n);
 74  for i:=1 to n do d[c[i]]:=i;
 75  for i:=1 to d[1]-1 do
 76  begin
 77   inc(m); q[m]:=b[i]-a[i]+1; shiftup(m,m);
 78  end;
 79  s:=a[d[1]];
 80  for i:=1 to d[1] do
 81   if a[i]>a[d[1]] then inc(ans);
 82  inc(ans); t:=ans;
 83  w:=d[1]+1;
 84  while m>0 do
 85  begin
 86   if s-q[1]>=0 then
 87   begin
 88    s:=s-q[1]; q[1]:=oo; shiftdown(1,m); dec(t);
 89    while (w<=n)and(a[w]>s) do
 90    begin
 91     inc(m); q[m]:=b[w]-a[w]+1; shiftup(m,m);
 92     inc(w); inc(t);
 93    end;
 94    ans:=min(ans,t);
 95   end
 96    else break;
 97  end;
 98  writeln(ans);
 99  //close(input);
100  //close(output);
101 end.

 

posted on 2016-11-07 15:10  myx12345  阅读(406)  评论(0编辑  收藏  举报

导航