内容目录
好像这题二分也可以做……
话说这年头写堆都不用Heapify 函数的?
Program P2010; const maxc=100000; maxn=19999; maxaid=100000; maxf=2000000000; type node=record a,b:longint; end; heap=record size:longint; d:array[1..maxc] of longint; end; var n,c,f,i,j:longint; a:array[1..maxc] of node; h:heap; before,after:array[1..maxc] of longint; procedure swap(var a,b:longint); var p:longint; begin p:=a;a:=b;b:=p; end; procedure qsort(l,r:longint); var i,j:longint; m,p:node; begin i:=l; j:=r; m:=a[(l+r) shr 1]; repeat while a[i].a<m.a do inc(i); while a[j].a>m.a do dec(j); if i<=j then begin swap(a[i].a,a[j].a); swap(a[i].b,a[j].b); inc(i);dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end; procedure push(t:longint); var i:longint; begin with h do begin inc(size); d[size]:=t; i:=size; while i>1 do begin if d[i shr 1]>=d[i] then break; swap(d[i shr 1],d[i]); i:=i shr 1; end; end; end; procedure pop; var i,j:longint; begin with h do begin d[1]:=d[size]; dec(size); i:=1; while i shl 1<=size do begin j:=i shl 1; if (j<size) then if d[j]<d[j+1] then inc(j); if d[j]<d[i] then break; swap(d[i],d[j]); i:=j; end; end; end; function front:longint; begin exit(h.d[1]); end; function main:longint; var i,j,mid,ans,num:longint; begin mid:=n div 2; fillchar(before,sizeof(before),0); fillchar(after,sizeof(after),0); for i:=1 to mid do begin push(a[i].b); inc(before[mid+1],a[i].b); end; for i:=mid+2 to c-mid do begin if front<=a[i-1].b then before[i]:=before[i-1] else begin before[i]:=before[i-1]-front+a[i-1].b; pop; push(a[i-1].b); end; end; fillchar(h,sizeof(h),0); for i:=c downto c-mid+1 do begin push(a[i].b); inc(after[c-mid],a[i].b); end; for i:=c-mid-1 downto mid+1 do begin if front<=a[i+1].b then after[i]:=after[i+1] else begin after[i]:=after[i+1]-front+a[i+1].b; pop; push(a[i+1].b); end; end; ans:=f+1; num:=-1; for i:=mid+1 to c-mid do if f>=before[i]+after[i]+a[i].b then begin num:=i; end; if num=-1 then exit(-1); exit(a[num].a); end; begin while not seekeof do begin fillchar(h,sizeof(h),0); read(N,C,F); for i:=1 to c do read(a[i].a,a[i].b); qsort(1,c); writeln(main); end; end.