wikioi 1245最小的N个和
2013-09-08 10:12
LRJ的算法竞赛入门经典训练指南里有类似的题,原题要难很多,p189页
读入A,B两组中的所有数后,建立N个有序表:
A1+B1<A2+B1<A3+B1<...<AN+B1
A1+B2<A2+B2<A3+B2<...<AN+B2
...
A1+BN<A2+BN<A3+BN<...<AN+AN
将每个有序表的第一个数字(记作s)连同A,B的下标0推入优先队列,这样我们每一次取出队列中的队首,显然这个元素的s是最小的,输出。与此同时,我们需要延续这个有序表。在取出的结构体中,令其标号a加1,b的标号不变,那么,s=B[b]+A[a]。
实际操作时,因为b的标号不变,就可以不保存下标b以及数组B,直接将读入数组B改为读入每一个元素(记为k),并将s=k+a[1],a=1推入队列,每次取出元素后,令其a=a+1,s=s+A[a]-A[a-1],如此减少空间占用,只需要一个队列和一个保存A的数组
//By BLADEVIL
type
aa=record
num :array[..] of longint;
end;
bb=record
num,size :longint; end; var
x, y :aa;
n :longint;
heap :array[..] of bb;
t :longint; procedure swap(var a,b:longint);
var
z :longint;
begin
z:=a; a:=b; b:=z;
end; procedure qs(var xx:aa; low,high:longint);
var
i, j, z, c :longint;
begin
i:=low; j:=high; c:=xx.num[(i+j) div ];
while i<j do
begin
while c<xx.num[j] do dec(j);
while c>xx.num[i] do inc(i);
if i<=j then
begin
swap(xx.num[i],xx.num[j]);
inc(i); dec(j);
end;
end;
if i<high then qs(xx,i,high);
if j>low then qs(xx,low,j);
end; procedure init;
var
i :longint;
begin
read(n);
for i:= to n do read(x.num[i]);
for i:= to n do read(y.num[i]);
qs(x,,n);
qs(y,,n);
end; procedure up(x:longint);
begin
while (x>) and (heap[x].num<heap[x div ].num) do
begin
swap(heap[x].num,heap[x div ].num);
swap(heap[x].size,heap[x div ].size);
x:=x div ;
end;
end; procedure down(x:longint);
var
k :longint;
begin
k:=x;
while true do
begin
if (x<<<=t) and (heap[k].num>heap[x<<].num) then k:=x<<;
if (x<<+<=t) and (heap[k].num>heap[x<<+].num) then k:=x<<+;
if k=x then exit;
swap(heap[x].num,heap[k].num);
swap(heap[x].size,heap[k].size);
x:=k;
end;
end; procedure main;
var
i :longint;
begin
t:=;
for i:= to n do
begin
inc(t);
heap[t].num:=x.num[i]+y.num[];
heap[t].size:=;
up(t);
end;
for i:= to n do
begin
write(heap[].num,' ');
inc(t);
heap[t].num:=heap[].num-y.num[heap[].size]+y.num[heap[].size+];
heap[t].size:=heap[].size+;
up(t);
heap[].num:=heap[t].num;
heap[].size:=heap[t].size;
dec(t);
down(); end;
writeln;
end; begin
init;
main;
end.
wikioi 1245最小的N个和的更多相关文章
- codevs 1245 最小的N个和
1245 最小的N个和 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N ...
- 1245 最小的N个和
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有两个长度为 N 的序列 A 和 B, ...
- 1245 最小的N个和(前k小ai+bi)
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- code vs 1245 最小的N个和
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有两个长度为 N 的序列 A ...
- Codevs No.1245 最小的N个和
2016-05-31 18:52:15 题目链接: 最小的N个和 Codevs No.1245 题目大意: 给两个等长数列,各取一个数求和,找到最小的N组 解法: 堆优化的大暴力 直接枚举所有可能在最 ...
- CODEVS 1245 最小的N个和 堆+排序
原题链接 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求 ...
- AC日记——最小的N个和 codevs 1245
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- 最小的N个和(codevs 1245)
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- codevs 必做:堆:1245、2879 并查集:1069、1074、1073
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
随机推荐
- 【MVC】 小问题
[MVC] 小问题 1. url 传参中文乱码 : encodeURIComponent 转码 2. RedirectToAction 重定向 : ajax 调用无效, 直接 url 访问有效 3. ...
- SSH公钥认证(码云)
开发者向码云版本库写入最常用到的协议是 SSH 协议,因为 SSH 协议使用公钥认证,可以实现无口令访问,而若使用 HTTPS 协议每次身份认证时都需要提供口令.使用 SSH 公钥认证,就涉及到公钥的 ...
- Visual Studio Code 配置Go 开发环境最简单的方法!!!
由于大家都知道的原因,在国内如果想访问go等各种资源,都会遇到某种不可预知的神奇问题.导致在VS Code中安装 go 各种插件都会失败. 于是乎,网上就出现了各种各样的解决方案:什么手动git cl ...
- [CH5302]金字塔
题面 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间组成,房间之间连有通道.如果把房间看作节点, ...
- 更换ubuntu软件源的方法
第一步:查看本系统Codename 输入lsb_release -a查看本系统Codename,我的codename是bionic,如图: 第二步:搜索与codename对应的镜像地址 我搜索到的是: ...
- Jenkins的pipeline脚本中获取git代码变更用户名和email
// Get checkout output valuedef changeLogSets = checkout([$class: 'GitSCM', branches: [[name: '*/mas ...
- 虚拟机CentOS7.2 1611 Minimal最小化安装后桥接固定ip
ip addr show 或者 ip addr 或者 ip a vim /etc/sysconfig/network-scripts/ifcfg-ens33 根据 然后重启网卡 service net ...
- SpringBoot 入门学习(HelloWord)
前置知识 1.会利用 maven 构建项目 2.了解 Spring 注解 3.了解 RESTful API 的基本理论 4.SpringBoot 是 SpringMVC 的升级版,但两者没有必然的联系 ...
- VisualStudio2010项目转换为VisualStudio2005项目:解决方案和工程项目文件转换方法(2)
因为我现在不喜欢把一篇博客写的很长很长,这篇博客是接着上一篇博客来写的.上一篇文章我很详细的说明了修改项目文件解决方案的过程.这篇文章我就说说项目中的项目文件该怎么修改.因为我平日里主要做的是ASP. ...
- BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan
先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...