题意: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.