zoukankan      html  css  js  c++  java
  • 漫长的补结题报告之路 poj3622

    题意(引用):题意:有很多种草,有两个属性:价格和新鲜度;有很多牛,它们都会各自需求一种草,要求是其价格最低为ai,新鲜度最低为bi,且这些牛不希望自己的草和别人的一样。问要满足所有需求的最小花费是多少?

    一开始想的都是各种匹配,结果正解是贪心……

    应该来说想不到好方法时,不是二分答案就是贪心了吧?

    先按新鲜度为第一关键字,价格为第二关键字排序

    从最挑剔(新鲜度要求越高)的牛开始考虑,每次选择应当是价格最小并且能能满足当前牛的牧草

    可以这样想:当前处理的牛使没选过的牛中最挑剔的,新鲜度能满足当前牛的一定也能满足之前牛

    再来考虑价格,因为价格是最低要求,这次价格选择最低限度的,显然会为之后的选择打开更多空间

    所以每次每次选择应当是价格最小并且能能满足当前牛的牧草是最优的

    朴素模拟复杂度O(nm) ,所以需要各种数据结构优化

    考虑到好久没有写平衡树(其实是一开始想到的就是平衡树)

    于是就写了splay

      1 var cv,cw,v,w,d,fa:array[0..200010] of longint;
      2     son:array[0..200010,1..2] of longint;
      3     root,i,j,p,n,m,t,h:longint;
      4     ans:int64;
      5 function succ(x:longint):longint;   //找后继
      6   var p:longint;
      7   begin
      8     p:=son[x,2];
      9     while son[p,1]<>0 do  p:=son[p,1];
     10     exit(p);
     11   end;
     12 
     13 procedure rotate(x,w:longint);
     14   var y:longint;
     15   begin
     16     y:=fa[x];
     17     if fa[y]<>0 then
     18     begin
     19       if son[fa[y],1]=y then son[fa[y],1]:=x
     20       else son[fa[y],2]:=x;
     21     end;
     22     fa[x]:=fa[y];
     23     son[y,3-w]:=son[x,w];
     24     if son[x,w]<>0 then fa[son[x,w]]:=y;
     25     son[x,w]:=y;
     26     fa[y]:=x;
     27   end;
     28 
     29 procedure splay(x:longint);     //拍习惯了就快了,还是那句话在哪里就往反向转
     30   var y:longint;
     31   begin
     32     while fa[x]<>0 do
     33     begin
     34       y:=fa[x];
     35       if fa[y]=0 then
     36       begin
     37         if son[y,1]=x then rotate(x,2)
     38         else rotate(x,1);
     39       end
     40       else begin
     41         if son[fa[y],1]=y then
     42         begin
     43           if son[y,1]=x then
     44           begin
     45             rotate(y,2);
     46             rotate(x,2);
     47           end
     48           else begin
     49             rotate(x,1);
     50             rotate(x,2);
     51           end;
     52         end
     53         else begin
     54           if son[y,1]=x then
     55           begin
     56             rotate(x,2);
     57             rotate(x,1);
     58           end
     59           else begin
     60             rotate(y,1);
     61             rotate(x,1);
     62           end;
     63         end;
     64       end;
     65     end;
     66     root:=x;
     67   end;
     68 
     69 procedure delete(x:longint);    //删除写得比较丑陋
     70   var p,y,q,u:longint;
     71   begin
     72     y:=fa[x];
     73     if y=0 then q:=0
     74     else if son[y,1]=x then q:=1
     75     else if son[y,2]=x then q:=2;
     76     if (son[x,1]<>0) and (son[x,2]<>0) then
     77     begin
     78       p:=succ(x);
     79       if (son[p,2]<>0) and (fa[p]<>x) then
     80       begin
     81         son[fa[p],1]:=son[p,2];
     82         fa[son[p,2]]:=fa[p];
     83       end
     84       else if fa[p]<>x then son[fa[p],1]:=0;
     85       son[p,1]:=son[x,1];
     86       fa[son[x,1]]:=p;
     87       if fa[p]<>x then
     88       begin
     89         son[p,2]:=son[x,2];
     90         fa[son[x,2]]:=p;
     91       end;
     92       if y<>0 then son[y,q]:=p;
     93       fa[p]:=y;
     94       splay(p);
     95     end
     96     else begin
     97       if y<>0 then
     98       begin
     99         if son[x,1]<>0 then
    100         begin
    101           son[y,q]:=son[x,1];
    102           fa[son[x,1]]:=y;
    103         end;
    104         if son[x,2]<>0 then
    105         begin
    106           son[y,q]:=son[x,2];
    107           fa[son[x,2]]:=y;
    108         end;
    109       end;
    110       if son[x,1]<>0 then u:=son[x,1] else u:=son[x,2];
    111       if y=0 then
    112       begin
    113         root:=u;
    114         fa[u]:=0;
    115       end
    116       else splay(y);
    117     end;
    118     dec(h);
    119     fa[x]:=0;
    120     son[x,1]:=0;
    121     son[x,2]:=0;
    122     d[x]:=0;
    123   end;
    124 
    125 procedure insert(x:longint);
    126   var p:longint;
    127   begin
    128     inc(t);
    129     inc(h);
    130     d[t]:=x;
    131     if h=1 then
    132     begin
    133       root:=1;
    134       fa[t]:=0;
    135     end
    136     else begin
    137       p:=root;
    138       repeat
    139         if d[p]>=x then
    140         begin
    141           if son[p,1]=0 then break;
    142           p:=son[p,1];
    143         end
    144         else begin
    145           if son[p,2]=0 then break;
    146           p:=son[p,2];
    147         end;
    148       until false;
    149       fa[t]:=p;
    150       if d[p]>=x then son[p,1]:=t else son[p,2]:=t;
    151       splay(t);
    152     end;
    153   end;
    154 
    155 procedure swap(var a,b:longint);
    156   var c:longint;
    157   begin
    158     c:=a;
    159     a:=b;
    160     b:=c;
    161   end;
    162 
    163 procedure sortc(l,r:longint);
    164   var i,j,x,y: longint;
    165   begin
    166     i:=l;
    167     j:=r;
    168     x:=cv[(l+r) shr 1];
    169     y:=cw[(l+r) shr 1];
    170     repeat
    171       while (cv[i]<x) or ((cv[i]=x) and (cw[i]<y)) do inc(i);
    172       while (x<cv[j]) or ((cv[j]=x) and (cw[j]>y)) do dec(j);
    173       if not(i>j) then
    174       begin
    175         swap(cv[i],cv[j]);
    176         swap(cw[i],cw[j]);
    177         inc(i);
    178         j:=j-1;
    179       end;
    180     until i>j;
    181     if l<j then sortc(l,j);
    182     if i<r then sortc(i,r);
    183   end;
    184 
    185 procedure sort(l,r:longint);
    186   var i,j,x,y: longint;
    187   begin
    188     i:=l;
    189     j:=r;
    190     x:=v[(l+r) shr 1];
    191     y:=w[(l+r) shr 1];
    192     repeat
    193       while (v[i]<x) or ((v[i]=x) and (w[i]<y)) do inc(i);
    194       while (x<v[j]) or ((v[j]=x) and (w[j]>y)) do dec(j);
    195       if not(i>j) then
    196       begin
    197         swap(w[i],w[j]);
    198         swap(v[i],v[j]);
    199         inc(i);
    200         j:=j-1;
    201       end;
    202     until i>j;
    203     if l<j then sort(l,j);
    204     if i<r then sort(i,r);
    205   end;
    206 begin
    207   readln(n,m);
    208   for i:=1 to n do
    209     readln(cw[i],cv[i]);
    210   for i:=1 to m do
    211     readln(w[i],v[i]);
    212   if m<n then
    213   begin
    214     writeln(-1);
    215     halt;
    216   end;
    217   sortc(1,n);
    218   sort(1,m);
    219   j:=m;
    220   t:=0;
    221   root:=0;
    222   fillchar(son,sizeof(son),0);
    223   fillchar(fa,sizeof(fa),0);
    224   for i:=n downto 1 do
    225   begin
    226     while v[j]>=cv[i] do
    227     begin
    228       insert(w[j]);
    229       dec(j);
    230     end;
    231     insert(cw[i]);
    232     p:=succ(t);
    233     if p<>0 then
    234     begin
    235       ans:=ans+d[p];
    236       delete(t);
    237       delete(p);
    238     end
    239     else begin
    240       ans:=-1;
    241       break;
    242     end;
    243   end;
    244   writeln(ans);
    245 end.
    View Code

    话说splay终于写对了还是1Y,好高兴



  • 相关阅读:
    实体ip 虚拟ip 固定ip 动态ip
    mysql数据库性能调优总结积累
    Java项目相关监控与调优
    线程锁与避免线程锁 线程锁检测
    在Eclipse中使用JUnit4进行单元测试(高级篇)
    MySQL性能优化的21条最佳经验【转】
    在Eclipse中使用JUnit4进行单元测试(中级篇)
    在Eclipse中使用JUnit4进行单元测试(初级篇)
    Windbg学习使用
    性能测试积累总结
  • 原文地址:https://www.cnblogs.com/phile/p/4473271.html
Copyright © 2011-2022 走看看