• 【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.
  • 相关阅读:
    如何生成随机数
    2017新数组
    JAVA基础
    java基本数据类型
    简易图片自动轮播
    JDK,JRE,JVM
    年月日 日期选择问题
    多选按钮选中进行下一步
    js基本函数和基本方法
    数组简单应用
  • 原文地址:https://www.cnblogs.com/myx12345/p/6039002.html
Copyright © 2020-2023  润新知