【NOIP2017练习】怎样打好隔膜(贪心,堆,带删除priority_queue)
题意:OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“我的手速虽然已经站在了人类的巅峰,但是打隔膜还是输。我换了很多队友,但是没有用。请问应该怎样打好隔膜?”
长者回答:“你啊,Too Young Too Simple,Sometimes Naive!不过你来看看这个游戏,或许对你有些帮助。”
长者回答:“你啊,Too Young Too Simple,Sometimes Naive!不过你来看看这个游戏,或许对你有些帮助。”
这是一个类似星球大战的游戏。有n个星球排成一列,第i个星球和第i+1个星球存在一条耗时为1、可多次经过的航线。同时还存在m扇传送门,一扇由i到j的传送门可以瞬间将抖儿从第i个星球传送到第j个星球或从第j个星球传送到第i个星球,但是传送完毕后传送门会消失。此外,抖儿目前的资源可以额外建造不多于p扇传送门。
抖儿可以从任意一个星球出发,经过所有的航线和传送门至少一次,然后在任意一个星球结束。抖儿自然希望能在尽量短的时间内完成任务,请你帮忙计算答案。
对于所有的数据,保证n≤1e9,m≤100000,p≤100000
思路:LYY压轴题
pascal用堆实现带删除priority_queue
开两个堆,一个放被删除元素的堆,删除元素时将其复制放入
取堆顶时判断堆顶是否与删除堆的堆顶相同
因为此题元素有两个值,需要二次比较
写的神志模糊 转C保平安
1 type arr=record 2 x:int64; 3 y,t:longint; 4 end; 5 6 var q1,q2:array[0..2000000]of arr; 7 d,du,x,y:array[0..1100000]of longint; 8 pre,next:array[0..1100000]of longint; 9 a:array[0..1100000]of int64; 10 n,m,i,t,t1,t2,up,cnt1,cnt2,p,tmp,p1,p2,k:longint; 11 ans:int64; 12 13 procedure swap(var x,y:int64); 14 var t:int64; 15 begin 16 t:=x; x:=y; y:=t; 17 end; 18 19 procedure qsort(l,r:longint); 20 var i,j,t,mid:longint; 21 begin 22 i:=l; j:=r; mid:=d[(l+r)>>1]; 23 repeat 24 while mid>d[i] do inc(i); 25 while mid<d[j] do dec(j); 26 if i<=j then 27 begin 28 t:=d[i]; d[i]:=d[j]; d[j]:=t; 29 inc(i); dec(j); 30 end; 31 until i>j; 32 if l<j then qsort(l,j); 33 if i<r then qsort(i,r); 34 end; 35 36 function hash(k:longint):longint; 37 var l,r,mid:longint; 38 begin 39 l:=1; r:=up; 40 while l<=r do 41 begin 42 mid:=(l+r)>>1; 43 if d[mid]=k then exit(mid); 44 if d[mid]<k then l:=mid+1 45 else r:=mid-1; 46 end; 47 end; 48 49 50 51 procedure ins(x:int64;y:longint); 52 var t1,t2,t,tmp,k:longint; 53 begin 54 inc(cnt1); 55 q1[cnt1].x:=x; q1[cnt1].y:=y; 56 k:=cnt1; 57 while (k>1)and((x<q1[k>>1].x)or(x=q1[k>>1].x)and(y<q1[k>>1].y)) do 58 begin 59 t:=k>>1; 60 t1:=q1[k].y; t2:=q1[t].y; 61 swap(q1[k].x,q1[t].x); 62 tmp:=q1[k].y; q1[k].y:=q1[t].y; q1[t].y:=tmp; 63 k:=k>>1; 64 end; 65 end; 66 67 procedure del(x:int64;y:longint); 68 var t1,t2,t,tmp,k:longint; 69 begin 70 inc(cnt2); 71 q2[cnt2].x:=x; q2[cnt2].y:=y; 72 k:=cnt2; 73 while (k>1)and((x<q2[k>>1].x)or(x=q2[k>>1].x)and(y<q2[k>>1].y)) do 74 begin 75 t:=k>>1; 76 t1:=q2[k].y; t2:=q2[t].y; 77 swap(q2[k].x,q2[t].x); 78 tmp:=q2[k].y; q2[k].y:=q2[t].y; q2[t].y:=tmp; 79 k:=k>>1; 80 end; 81 end; 82 83 begin 84 85 readln(n,m,p); 86 up:=2; d[1]:=1; d[2]:=n; 87 for i:=1 to m do 88 begin 89 read(x[i],y[i]); 90 inc(up); d[up]:=x[i]; 91 inc(up); d[up]:=y[i]; 92 end; 93 qsort(1,up); 94 t:=up; up:=1; 95 for i:=2 to t do 96 if d[i]<>d[up] then begin inc(up); d[up]:=d[i]; end; 97 du[1]:=1; du[up]:=1; 98 for i:=1 to m do 99 begin 100 x[i]:=hash(x[i]); 101 y[i]:=hash(y[i]); 102 du[x[i]]:=du[x[i]] xor 1; 103 du[y[i]]:=du[y[i]] xor 1; 104 end; 105 106 tmp:=0; m:=0; 107 for i:=1 to up do 108 if du[i]=1 then 109 begin 110 if tmp>0 then begin inc(m); a[m]:=d[i]-d[tmp]; end; 111 tmp:=i; 112 end; 113 114 115 for i:=1 to m do 116 begin 117 //writeln(a[i]); 118 ins(a[i],i); 119 pre[i]:=i-1; 120 next[i]:=i+1; 121 end; 122 123 t:=(m-1) div 2-p; 124 //writeln(t); 125 for i:=1 to t do 126 begin 127 if cnt2>0 then 128 begin 129 t1:=1; t2:=1; 130 while (q1[t1].x=q2[t2].x)and(q1[t1].y=q2[t2].y) do 131 begin 132 q1[t1].x:=1<<60; 133 while t1<<1<=cnt1 do 134 begin 135 k:=t1<<1; 136 if (k+1<=cnt1)and((q1[k+1].x<q1[k].x)or 137 ((q1[k+1].x=q1[k].x)and(q1[k+1].y<q1[k].y))) then inc(k); 138 if q1[k].x<q1[t1].x then 139 begin 140 swap(q1[k].x,q1[t1].x); 141 tmp:=q1[k].y; q1[k].y:=q1[t1].y; q1[t1].y:=tmp; 142 t1:=k; 143 end 144 else break; 145 end; 146 q2[t2].x:=1<<60; 147 while t2<<1<=cnt2 do 148 begin 149 k:=t2<<1; 150 if (k+1<=cnt2)and((q2[k+1].x<q2[k].x)or 151 ((q2[k+1].x=q2[k].x)and(q2[k+1].y<q2[k].y))) then inc(k); 152 if q2[k].x<q2[t2].x then 153 begin 154 swap(q2[k].x,q2[t2].x); 155 tmp:=q2[k].y; q2[k].y:=q2[t2].y; q2[t2].y:=tmp; 156 t2:=k; 157 end 158 else break; 159 end; 160 t1:=1; t2:=1; 161 end; 162 end; 163 t2:=q1[1].y; t1:=q1[1].x; 164 del(t1,t2); 165 ans:=ans+t1; 166 if pre[t2]=0 then 167 begin 168 p1:=next[t2]; 169 // writeln(p1); 170 del(a[p1],p1); 171 pre[next[next[t2]]]:=0; 172 continue; 173 end 174 else if next[t2]>m then 175 begin 176 p1:=pre[t2]; 177 // writeln(p1); 178 del(a[p1],p1); 179 next[pre[pre[t2]]]:=m+1; 180 continue; 181 end; 182 tmp:=t2; 183 p1:=pre[tmp]; p2:=next[tmp]; 184 // writeln(p1,' ',p2); 185 pre[tmp]:=pre[p1]; 186 next[tmp]:=next[p2]; 187 pre[next[tmp]]:=tmp; 188 next[pre[tmp]]:=tmp; 189 a[tmp]:=a[p1]+a[p2]-a[tmp]; 190 ins(a[tmp],tmp); 191 del(a[p1],p1); 192 del(a[p2],p2); 193 end; 194 195 writeln(ans+n-1); 196 197 end.
【后记】
抖儿深深沉迷于这个游戏不能自拔,日渐消瘦。
终于有一天,抖儿大彻大悟,说:“我知道了!玩游戏要的不仅仅是蛮力和手速,还需要智慧和策略。”
长者嘿嘿一笑:“你想多了。难道你还没发现你只适合玩单机游戏?”
抖儿恼羞成怒,便怂恿香港记者们造了一个大新闻,将长者批判了一番。
null