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

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

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

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

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

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

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

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

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

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

于是就写了splay

  1. var cv,cw,v,w,d,fa:array[..] of longint;
  2.     son:array[..,..] 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,];
  9.     while son[p,]<> do  p:=son[p,];
  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]<> then
  18.     begin
  19.       if son[fa[y],]=y then son[fa[y],]:=x
  20.       else son[fa[y],]:=x;
  21.     end;
  22.     fa[x]:=fa[y];
  23.     son[y,-w]:=son[x,w];
  24.     if son[x,w]<> 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]<> do
  33.     begin
  34.       y:=fa[x];
  35.       if fa[y]= then
  36.       begin
  37.         if son[y,]=x then rotate(x,)
  38.         else rotate(x,);
  39.       end
  40.       else begin
  41.         if son[fa[y],]=y then
  42.         begin
  43.           if son[y,]=x then
  44.           begin
  45.             rotate(y,);
  46.             rotate(x,);
  47.           end
  48.           else begin
  49.             rotate(x,);
  50.             rotate(x,);
  51.           end;
  52.         end
  53.         else begin
  54.           if son[y,]=x then
  55.           begin
  56.             rotate(x,);
  57.             rotate(x,);
  58.           end
  59.           else begin
  60.             rotate(y,);
  61.             rotate(x,);
  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= then q:=
  74.     else if son[y,]=x then q:=
  75.     else if son[y,]=x then q:=;
  76.     if (son[x,]<>) and (son[x,]<>) then
  77.     begin
  78.       p:=succ(x);
  79.       if (son[p,]<>) and (fa[p]<>x) then
  80.       begin
  81.         son[fa[p],]:=son[p,];
  82.         fa[son[p,]]:=fa[p];
  83.       end
  84.       else if fa[p]<>x then son[fa[p],]:=;
  85.       son[p,]:=son[x,];
  86.       fa[son[x,]]:=p;
  87.       if fa[p]<>x then
  88.       begin
  89.         son[p,]:=son[x,];
  90.         fa[son[x,]]:=p;
  91.       end;
  92.       if y<> then son[y,q]:=p;
  93.       fa[p]:=y;
  94.       splay(p);
  95.     end
  96.     else begin
  97.       if y<> then
  98.       begin
  99.         if son[x,]<> then
  100.         begin
  101.           son[y,q]:=son[x,];
  102.           fa[son[x,]]:=y;
  103.         end;
  104.         if son[x,]<> then
  105.         begin
  106.           son[y,q]:=son[x,];
  107.           fa[son[x,]]:=y;
  108.         end;
  109.       end;
  110.       if son[x,]<> then u:=son[x,] else u:=son[x,];
  111.       if y= then
  112.       begin
  113.         root:=u;
  114.         fa[u]:=;
  115.       end
  116.       else splay(y);
  117.     end;
  118.     dec(h);
  119.     fa[x]:=;
  120.     son[x,]:=;
  121.     son[x,]:=;
  122.     d[x]:=;
  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= then
  132.     begin
  133.       root:=;
  134.       fa[t]:=;
  135.     end
  136.     else begin
  137.       p:=root;
  138.       repeat
  139.         if d[p]>=x then
  140.         begin
  141.           if son[p,]= then break;
  142.           p:=son[p,];
  143.         end
  144.         else begin
  145.           if son[p,]= then break;
  146.           p:=son[p,];
  147.         end;
  148.       until false;
  149.       fa[t]:=p;
  150.       if d[p]>=x then son[p,]:=t else son[p,]:=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 ];
  169.     y:=cw[(l+r) shr ];
  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-;
  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 ];
  191.     y:=w[(l+r) shr ];
  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-;
  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:= to n do
  209.     readln(cw[i],cv[i]);
  210.   for i:= to m do
  211.     readln(w[i],v[i]);
  212.   if m<n then
  213.   begin
  214.     writeln(-);
  215.     halt;
  216.   end;
  217.   sortc(,n);
  218.   sort(,m);
  219.   j:=m;
  220.   t:=;
  221.   root:=;
  222.   fillchar(son,sizeof(son),);
  223.   fillchar(fa,sizeof(fa),);
  224.   for i:=n downto 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<> then
  234.     begin
  235.       ans:=ans+d[p];
  236.       delete(t);
  237.       delete(p);
  238.     end
  239.     else begin
  240.       ans:=-;
  241.       break;
  242.     end;
  243.   end;
  244.   writeln(ans);
  245. end.

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

漫长的补结题报告之路 poj3622的更多相关文章

  1. 《基于Arm实验箱的国密算法应用》课程设计 结题报告

    <基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...

  2. 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

    <基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...

  3. [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告

    刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...

  4. hdu1281结题报告

    哎哎...自己刚刚一看到这个题目居然.....什么都想不到...看了一下别人的解题报告说最大匹配...于是就自己开始构思啦... 对于这个棋盘,有K个可以放棋子的位置....那么 首先我们开始可以求出 ...

  5. 2013山东省ICPC结题报告

    A.Rescue The Princess 已知一个等边三角形的两个顶点A.B,求第三个顶点C,A.B.C成逆时针方向. 常规的解题思路就是用已知的两个点列出x,y方程,但这样求出方程的解的表达式比较 ...

  6. uva401 - Palindromes结题报告

    题目地址 :  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告

    题目很简单就拿着这道题简单说说 有向图强连通分支的Tarjan算法 有向图强连通分支的Tarjan算法伪代码如下:void Tarjan(u) {dfn[u]=low[u]=++index//进行DF ...

  8. 2016noipday1t1玩具迷题结题报告

    经常读这个代码有益于比赛时想起一些思路.... day1t1,洛谷dalao称之为水题...??然后我去年还是没拿到分,就这个,我还就写了40%的数据,AC到40,然而这不是关键,注释了freopen ...

  9. 2017 五一 清北学堂 Day1模拟考试结题报告

    预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...

随机推荐

  1. Couchbase上发布的关于NoSQL的技术论文

    Couchbase是CouchDB与Membase两个NoSQL数据库相结合的产物,本文推荐的是Couchbase官方发表的一篇论文,命名为<NoSQL Database Technology& ...

  2. Node.js 【使用npm安装一些包失败之笔记】

    镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...

  3. window.print打印指定div实例代码

    window.print可以打印网页,但有时候我们只希望打印特定控件或内容,怎么办呢,请看下面的例子 首先我们可以把要打印的内容放在div中,然后用下面的代码进行打印. 复制代码代码如下: <h ...

  4. DrawWindowFrame

    extern void DrawWindowFrame(HWND hWnd)//画窗口边框 { RECT rc; HWND DeskHwnd = ::GetDesktopWindow(); //取得桌 ...

  5. 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  6. 2014年辛星完全解读Javascript第七节 数组和对象

    由于Javascript是脚本语言,因此,使用起来非常方便,数组的使用也是比较简单的,下面我们就主要介绍一下Javascript中数组的介绍,以及上一节中没有完成的对象的介绍. *********** ...

  7. 浅析nginx的负载均衡

    Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: upstream backend { server ...

  8. python学习笔记3(字符串)

    Python字符串: 在Python中的字符串被确定为一组连续的字符在引号之间, Python允许在任何对单引号或双引号. 串的子集,可以使用切片操作符可采用([]和[:]),索引从0开始的字符串的开 ...

  9. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  10. Apache2.2+php5.4在windows上配置实例

    这几天一直在win8.1上配置apache+php环境,网上看了很多文章,自己又犯了很多错误才配置成功,对新手来说真是有点小难. 自己打算把配置的详细过程写下来,好帮助其他新手快速配置. 在这里参考了 ...