标签:第一个 heap 序列 list radius color return 数字 -o
输入格式:
第一行一个正整数N;
第二行N个整数A_iAi?, 满足A_i\le A_{i+1}Ai?≤Ai+1?且A_i\le 10^9Ai?≤109;
第三行N个整数B_iBi?, 满足B_i\le B_{i+1}Bi?≤Bi+1?且B_i\le 10^9Bi?≤109.
【数据规模】
对于50%的数据中,满足1<=N<=1000;
对于100%的数据中,满足1<=N<=100000。
输出格式:
输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
3 6 7
for (int i = 1;i <= n;i++) for (int j = 1;j <= n;j++) c[i][j] = a[i]+b[j];
for (int i = 1;i <= n;i++)
heap[i] = c[i][j];
while(没有输出够n个数) { 输出; 放入 堆顶数所在的数组的下一个数 维护 }
优化:
for (int i = 1;i <= n;i++) heap[i] = a[i]+b[1] …… int t = from[1]; step[t]++; heap[1]=a[t] + b[ step[t] ];
代码:
#include<bits/stdc++.h> using namespace std; int a[100000],b[100000],heap[100000],from[100000],step[100000],n,sum=1; void swap(int x,int y)//手打swap交换,同时交换来源数组。 { int k = heap[x]; heap[x] = heap[y]; heap[y] = k; k = from[x]; from[x] = from[y]; from[y] = k; } int main() { scanf("%d",&n); for (int i = 1;i <= n;i++) scanf("%d",&a[i]); for (int i = 1;i <= n;i++) scanf("%d",&b[i]); for (int i = 1;i <= n;i++) heap[i] = a[i]+b[1],from[i] = i,step[i] = 1; //这一步就是优化。把c去掉了,取而代之的是现做现卖的合成。 while (sum <= n) { printf("%d ",heap[1]); int t = from[1]; step[t]++; heap[1]=a[t] + b[ step[t] ];//现做现卖的合成。 int x = 1,s; while (x<<1 <= n)//经典的下传 { s = x<<1; if (heap[s] > heap[s + 1] && s + 1 <= n) s++; if (heap[x] > heap[s]) { swap(x,s); x = s; }else break; } sum++; } return 0; }
标签:第一个 heap 序列 list radius color return 数字 -o
原文地址:https://www.cnblogs.com/wjnclln/p/9571218.html