zoukankan      html  css  js  c++  java
  • 【NOIP2017练习】怎样打好隔膜(贪心,堆,带删除priority_queue)

    题意:OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“我的手速虽然已经站在了人类的巅峰,但是打隔膜还是输。我换了很多队友,但是没有用。请问应该怎样打好隔膜?”
    长者回答:“你啊,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.
    【后记】
    抖儿深深沉迷于这个游戏不能自拔,日渐消瘦。
    终于有一天,抖儿大彻大悟,说:“我知道了!玩游戏要的不仅仅是蛮力和手速,还需要智慧和策略。”
    长者嘿嘿一笑:“你想多了。难道你还没发现你只适合玩单机游戏?”
    抖儿恼羞成怒,便怂恿香港记者们造了一个大新闻,将长者批判了一番。
  • 相关阅读:
    C语言探索之旅 | 第二部分第十一课:练习题和习作
    C语言探索之旅 | 第二部分第十课: 实战"悬挂小人"游戏答案
    C语言探索之旅 | 第二部分第九课: 实战"悬挂小人"游戏
    C语言探索之旅 | 第二部分第八课:动态分配
    C语言探索之旅 | 第二部分第七课:文件读写
    最近迫切应学的编程语言
    C语言探索之旅 | 第二部分第五课:预处理
    封装axios方法之一
    react前置路由守卫
    React Router 4.0 实现路由守卫
  • 原文地址:https://www.cnblogs.com/myx12345/p/7793628.html
Copyright © 2011-2022 走看看