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个和的更多相关文章

  1. codevs 1245 最小的N个和

    1245 最小的N个和 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N ...

  2. 1245 最小的N个和

    1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description 有两个长度为 N 的序列 A 和 B, ...

  3. 1245 最小的N个和(前k小ai+bi)

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  4. code vs 1245 最小的N个和

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 有两个长度为 N 的序列 A ...

  5. Codevs No.1245 最小的N个和

    2016-05-31 18:52:15 题目链接: 最小的N个和 Codevs No.1245 题目大意: 给两个等长数列,各取一个数求和,找到最小的N组 解法: 堆优化的大暴力 直接枚举所有可能在最 ...

  6. CODEVS 1245 最小的N个和 堆+排序

    原题链接 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求 ...

  7. AC日记——最小的N个和 codevs 1245

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  8. 最小的N个和(codevs 1245)

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  9. codevs 必做:堆:1245、2879 并查集:1069、1074、1073

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

随机推荐

  1. JAVA虚拟机(一):内存区域

    根据<java虚拟机规范第二版>规定,现阶段的java内存区域总体如下图 其中,方法区和堆是所有线程共享区域. 虚拟机栈,本地方法栈,程序计数器是各线程独占. 概述一下各个区域 先说说线程 ...

  2. Mysql性能优化四:分库,分区,分表,你们如何做?

    分库分区分表概念 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的 分表 就是把一张数据量很大的表按一定的规则分解成N个具有独立存储空间的实体表.系统读写时 ...

  3. jira+mysql+破解+中文+compose

    1.制作docker-compose.yml 2.安装 $ docker stack deploy -c docker-compose.yml mshk_jira

  4. linux备忘录-例行性工作排程 (crontab)

    例行性工作排程 例行性工作排程分为两类 at at是只执行一次就结束的指令安排.要想使用at,必须要有atd服务的支持. crontab crontab是每隔一段时间自动执行的指令安排.crontab ...

  5. ACM训练大纲

    1. 算法总结及推荐题目 1.1 C++ STL • STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset• STL ...

  6. UVA215 Spreadsheet

    这道题题目大意就是计算带有单元格引用的各单元格的值. 这道题本身不难,有以下几个关键点: 1.如何判断一个单元格循环引用 2.注意对字符串的细致处理 我出现的错误出现在以上两个方面,思路本身是不难的. ...

  7. Java IO 之 System类

    1.使用System.in.read读取,使用System.out.println 输出 package org.zln.io; import java.io.IOException; /** * C ...

  8. adoop集群动态添加和删除节点

    hadoop集群动态添加和删除节点说明 上篇博客我已经安装了Hadoop集群(hadoop集群的安装步骤和配置),现在写这个博客我将在之前的基础上进行节点的添加的删除. 首先将启动四台机器(一主三从) ...

  9. 【题解】HAOI2011Problem b

    第一次接触莫比乌斯反演,总之脑子都快要炸掉了……好难啊!本蒟蒻表示根本无法理解呜呜呜呜呜……不过在机房DL的帮助下总算是磕磕绊绊的A掉了这一题: 这道题目要我们的求的是:(1)ΣiΣj [gcd(i, ...

  10. CF893F Subtree Minimum Query 解题报告

    CF893F Subtree Minimum Query 输入输出格式 输入格式: The first line contains two integers \(n\) and \(r\) ( \(1 ...