漫长的补结题报告之路 poj3622
题意(引用):题意:有很多种草,有两个属性:价格和新鲜度;有很多牛,它们都会各自需求一种草,要求是其价格最低为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的更多相关文章
- 《基于Arm实验箱的国密算法应用》课程设计 结题报告
<基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...
- 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告
<基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...
- [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...
- hdu1281结题报告
哎哎...自己刚刚一看到这个题目居然.....什么都想不到...看了一下别人的解题报告说最大匹配...于是就自己开始构思啦... 对于这个棋盘,有K个可以放棋子的位置....那么 首先我们开始可以求出 ...
- 2013山东省ICPC结题报告
A.Rescue The Princess 已知一个等边三角形的两个顶点A.B,求第三个顶点C,A.B.C成逆时针方向. 常规的解题思路就是用已知的两个点列出x,y方程,但这样求出方程的解的表达式比较 ...
- uva401 - Palindromes结题报告
题目地址 : http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告
题目很简单就拿着这道题简单说说 有向图强连通分支的Tarjan算法 有向图强连通分支的Tarjan算法伪代码如下:void Tarjan(u) {dfn[u]=low[u]=++index//进行DF ...
- 2016noipday1t1玩具迷题结题报告
经常读这个代码有益于比赛时想起一些思路.... day1t1,洛谷dalao称之为水题...??然后我去年还是没拿到分,就这个,我还就写了40%的数据,AC到40,然而这不是关键,注释了freopen ...
- 2017 五一 清北学堂 Day1模拟考试结题报告
预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...
随机推荐
- Couchbase上发布的关于NoSQL的技术论文
Couchbase是CouchDB与Membase两个NoSQL数据库相结合的产物,本文推荐的是Couchbase官方发表的一篇论文,命名为<NoSQL Database Technology& ...
- Node.js 【使用npm安装一些包失败之笔记】
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...
- window.print打印指定div实例代码
window.print可以打印网页,但有时候我们只希望打印特定控件或内容,怎么办呢,请看下面的例子 首先我们可以把要打印的内容放在div中,然后用下面的代码进行打印. 复制代码代码如下: <h ...
- DrawWindowFrame
extern void DrawWindowFrame(HWND hWnd)//画窗口边框 { RECT rc; HWND DeskHwnd = ::GetDesktopWindow(); //取得桌 ...
- 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 2014年辛星完全解读Javascript第七节 数组和对象
由于Javascript是脚本语言,因此,使用起来非常方便,数组的使用也是比较简单的,下面我们就主要介绍一下Javascript中数组的介绍,以及上一节中没有完成的对象的介绍. *********** ...
- 浅析nginx的负载均衡
Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: upstream backend { server ...
- python学习笔记3(字符串)
Python字符串: 在Python中的字符串被确定为一组连续的字符在引号之间, Python允许在任何对单引号或双引号. 串的子集,可以使用切片操作符可采用([]和[:]),索引从0开始的字符串的开 ...
- Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- Apache2.2+php5.4在windows上配置实例
这几天一直在win8.1上配置apache+php环境,网上看了很多文章,自己又犯了很多错误才配置成功,对新手来说真是有点小难. 自己打算把配置的详细过程写下来,好帮助其他新手快速配置. 在这里参考了 ...