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

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

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

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

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

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

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

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

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

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

于是就写了splay

 var cv,cw,v,w,d,fa:array[..] of longint;
    son:array[..,..] of longint;
    root,i,j,p,n,m,t,h:longint;
    ans:int64;
function succ(x:longint):longint;   //找后继
  var p:longint;
  begin
    p:=son[x,];
    while son[p,]<> do  p:=son[p,];
    exit(p);
  end; procedure rotate(x,w:longint);
  var y:longint;
  begin
    y:=fa[x];
    if fa[y]<> then
    begin
      if son[fa[y],]=y then son[fa[y],]:=x
      else son[fa[y],]:=x;
    end;
    fa[x]:=fa[y];
    son[y,-w]:=son[x,w];
    if son[x,w]<> then fa[son[x,w]]:=y;
    son[x,w]:=y;
    fa[y]:=x;
  end; procedure splay(x:longint);     //拍习惯了就快了,还是那句话在哪里就往反向转
  var y:longint;
  begin
    while fa[x]<> do
    begin
      y:=fa[x];
      if fa[y]= then
      begin
        if son[y,]=x then rotate(x,)
        else rotate(x,);
      end
      else begin
        if son[fa[y],]=y then
        begin
          if son[y,]=x then
          begin
            rotate(y,);
            rotate(x,);
          end
          else begin
            rotate(x,);
            rotate(x,);
          end;
        end
        else begin
          if son[y,]=x then
          begin
            rotate(x,);
            rotate(x,);
          end
          else begin
            rotate(y,);
            rotate(x,);
          end;
        end;
      end;
    end;
    root:=x;
  end; procedure delete(x:longint);    //删除写得比较丑陋
  var p,y,q,u:longint;
  begin
    y:=fa[x];
    if y= then q:=
    else if son[y,]=x then q:=
    else if son[y,]=x then q:=;
    if (son[x,]<>) and (son[x,]<>) then
    begin
      p:=succ(x);
      if (son[p,]<>) and (fa[p]<>x) then
      begin
        son[fa[p],]:=son[p,];
        fa[son[p,]]:=fa[p];
      end
      else if fa[p]<>x then son[fa[p],]:=;
      son[p,]:=son[x,];
      fa[son[x,]]:=p;
      if fa[p]<>x then
      begin
        son[p,]:=son[x,];
        fa[son[x,]]:=p;
      end;
      if y<> then son[y,q]:=p;
      fa[p]:=y;
      splay(p);
    end
    else begin
      if y<> then
      begin
        if son[x,]<> then
        begin
          son[y,q]:=son[x,];
          fa[son[x,]]:=y;
        end;
        if son[x,]<> then
        begin
          son[y,q]:=son[x,];
          fa[son[x,]]:=y;
        end;
      end;
      if son[x,]<> then u:=son[x,] else u:=son[x,];
      if y= then
      begin
        root:=u;
        fa[u]:=;
      end
      else splay(y);
    end;
    dec(h);
    fa[x]:=;
    son[x,]:=;
    son[x,]:=;
    d[x]:=;
  end; procedure insert(x:longint);
  var p:longint;
  begin
    inc(t);
    inc(h);
    d[t]:=x;
    if h= then
    begin
      root:=;
      fa[t]:=;
    end
    else begin
      p:=root;
      repeat
        if d[p]>=x then
        begin
          if son[p,]= then break;
          p:=son[p,];
        end
        else begin
          if son[p,]= then break;
          p:=son[p,];
        end;
      until false;
      fa[t]:=p;
      if d[p]>=x then son[p,]:=t else son[p,]:=t;
      splay(t);
    end;
  end; procedure swap(var a,b:longint);
  var c:longint;
  begin
    c:=a;
    a:=b;
    b:=c;
  end; procedure sortc(l,r:longint);
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=cv[(l+r) shr ];
    y:=cw[(l+r) shr ];
    repeat
      while (cv[i]<x) or ((cv[i]=x) and (cw[i]<y)) do inc(i);
      while (x<cv[j]) or ((cv[j]=x) and (cw[j]>y)) do dec(j);
      if not(i>j) then
      begin
        swap(cv[i],cv[j]);
        swap(cw[i],cw[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sortc(l,j);
    if i<r then sortc(i,r);
  end; procedure sort(l,r:longint);
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=v[(l+r) shr ];
    y:=w[(l+r) shr ];
    repeat
      while (v[i]<x) or ((v[i]=x) and (w[i]<y)) do inc(i);
      while (x<v[j]) or ((v[j]=x) and (w[j]>y)) do dec(j);
      if not(i>j) then
      begin
        swap(w[i],w[j]);
        swap(v[i],v[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end;
begin
  readln(n,m);
  for i:= to n do
    readln(cw[i],cv[i]);
  for i:= to m do
    readln(w[i],v[i]);
  if m<n then
  begin
    writeln(-);
    halt;
  end;
  sortc(,n);
  sort(,m);
  j:=m;
  t:=;
  root:=;
  fillchar(son,sizeof(son),);
  fillchar(fa,sizeof(fa),);
  for i:=n downto do
  begin
    while v[j]>=cv[i] do
    begin
      insert(w[j]);
      dec(j);
    end;
    insert(cw[i]);
    p:=succ(t);
    if p<> then
    begin
      ans:=ans+d[p];
      delete(t);
      delete(p);
    end
    else begin
      ans:=-;
      break;
    end;
  end;
  writeln(ans);
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. C#实现打印与打印预览功能

    C#实现打印与打印预览功能的思路及代码. 在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的 ...

  2. IEEE 754 浮点数的四种舍入方式

    四种舍入方向: 向最接近的可表示的值:当有两个最接近的可表示的值时首选"偶数"值:向负无穷大(向下):向正无穷大(向上)以及向0(截断). 说明:默认模式是最近舍入(Round t ...

  3. 关于location

    ---恢复内容开始--- window.location跳转+替换+刷新 一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pag ...

  4. 奖学金评分系统(系统分析与设计版与Delphi实现代码)

    一.系统规划 1.1 项目背景介绍 在奖学金评比过程中,学生综合测评是学校普遍采用的评比手段.对学生实施综合素质测评的目的在于正确评价学生的综合素质,为评奖学金提供依据,实现学生教育管理工作的标准化. ...

  5. 可视化Windows服务定时任务

    思路:1.新建一个<Windows服务项目>,在里面建服务文件(可以多个),用来做要执行的任务. 2.新建一个<Windows窗体应用程序>,在这个程序里管理服务.如:安装.卸 ...

  6. MVC5+EF6+BootStrap3.3.5 博客系统之EF(一)

  7. 巧用九宫格以减少UI资源量

    UI资源量对资源包大小和内存的影响 UI资源具有以下特点: (1)UI资源几乎都是图片,而图片是最占资源量的资源类型之一. (2)Unity不支持外部压缩,即使在外部将一个10MB的图片压缩到只剩1M ...

  8. 【BZOJ 1087】[SCOI2005]互不侵犯King

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  9. What we learned in Seoul with AlphaGo

    What we learned in Seoul with AlphaGo March 16, 2016 Go isn’t just a game—it’s a living, breathing c ...

  10. 破解之寻找OEP[手动脱壳](1)

    OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) 代表程序的 ...