Day1-Luogu-1631
题目描述
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个。
输入输出格式
输入格式:
第一行一个正整数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
2 6 6
1 4 8
3 6 7 思路:朴素做法的复杂度不可取,那么取完前3N个肯定有前N个的答案,代码如下:
const int maxm = ;
int a[maxm], b[maxm];
int main() {
int n;
scanf("%d", &n);
for (int i = ; i < n; ++i)
scanf("%d", &a[i]);
for (int i = ; i < n; ++i)
scanf("%d", &b[i]);
priority_queue<int, vector<int>, greater<int>> q;
int l = , r = ;
q.push(a[l] + b[r]);
while(q.size() <= *n) {
if(a[l] <= b[r]) {
l++;
if(l >= n)
break;
for (int i = ; i <= r; ++i)
q.push(a[l] + b[i]);
} else {
r++;
if(r >= n)
break;
for (int i = ; i <= l; ++i)
q.push(a[i] + b[r]);
}
}
for (int i = ;i < n; ++i) {
if(i)
printf(" ");
printf("%d", q.top());
q.pop();
}
return ;
}
看完别人的解析后,懂了一种新的做法,图示:
| a1 | a2 | a3 | a4 | a5 | |
| b1 | |||||
| b2 | |||||
| b3 | |||||
| b4 | |||||
| b5 |
此时N = 5, 若a3+b2是前N小,那么从a1+b1前面都是前N小,但其前面已经有N个了,则a3+b2不可能是前N小,即:(i-1)*(j-1) > N的点不可能产生贡献,代码如下:
const int maxm = ;
int a[maxm], b[maxm];
int main() {
int n;
scanf("%d", &n);
for (int i = ; i < n; ++i)
scanf("%d", &a[i]);
for (int i = ; i < n; ++i)
scanf("%d", &b[i]);
priority_queue<int, vector<int>, greater<int>> q;
for(int i = ; i < n; ++i) {
for (int j = ; j < n; ++j) {
if(i * j > n)
break;
q.push(a[i] + b[j]);
}
}
for (int i = ;i < n; ++i) {
if(i)
printf(" ");
printf("%d", q.top());
q.pop();
}
return ;
}
还有一种通用的合并队列最小值做法,因为a[1]+b[1]<=a[2]+b[1]<= ······ 这时候将所有的含有b[1]的压入队列,将最小的出队,例如,此时出队的是a[5]+b[1],那么下次入队的就是a[5]+b[2],且此时的a[5]+b[2]比任何还未入队的元素都大,循环往复找到N个即可,代码如下:
const int maxm = ;
struct Node{
int sum, ia, ib;
Node(int _sum, int _ia, int _ib):sum(_sum), ia(_ia), ib(_ib) {}
bool operator < (const Node &a)const {
return a.sum < sum;
}
};
int a[maxm], b[maxm];
int main() {
int n;
scanf("%d", &n);
for (int i = ; i < n; ++i)
scanf("%d", &a[i]);
for (int i = ; i < n; ++i)
scanf("%d", &b[i]);
priority_queue<Node> q;
for (int i = ; i < n; ++i) {
q.push(Node(a[i] + b[], i, ));
}
while(n--) {
Node tmp = q.top();
q.pop();
printf("%d ", tmp.sum);
q.push(Node(a[tmp.ia] + b[tmp.ib + ], tmp.ia, tmp.ib + ));
}
return ;
}
Day1-Luogu-1631的更多相关文章
- luogu 1631 序列合并
priority_queue的使用,注意 a[1]+b[1],a[1]+b[2],a[1]+b[3],a[1]+b[4].......a[1]+b[n] a[2]+b[1]......... .. a ...
- [LUOGU] NOIP提高组模拟赛Day1
题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...
- Luogu P1600[NOIP2016]day1 T2天天爱跑步
号称是noip2016最恶心的题 基本上用了一天来搞明白+给sy讲明白(可能还没讲明白 具体思路是真的不想写了(快吐了 如果要看,参见洛谷P1600 天天爱跑步--题解 虽然这样不好但我真的不想写了 ...
- LUOGU NOIP 2018 模拟赛 DAY1
T1 传送门 解题思路 这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了. #include<iostream> #include&l ...
- luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp
LINK:卡尔文球锦标赛 可以先思考一下合法的序列长什么样子. 可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队. 其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1 ...
- noip2011提高组day1+day2解题报告
Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
- 【NOIP2016 Day1 T2】天天爱跑步
题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...
- NOI Day1线上同步赛梦游记
Preface 第一次体验NOI,虽然不是正式选手,但是打打同步赛还是挺涨姿势的,也算是体验了一把. Day1很爆炸,一方面是NOI题目的难度高于自身的水平,另一方面也出现了比较大的失误,T1一个数组 ...
- 3728 联合权值[NOIP 2014 Day1 T2]
来源:NOIP2014 Day1 T2 OJ链接: http://codevs.cn/problem/3728/ https://www.luogu.org/problemnew/show/P1351 ...
- [luogu]P1600 天天爱跑步[LCA]
[luogu]P1600 [NOIP 2016]天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上 ...
随机推荐
- 【代码学习】PYTHON 文件I/O
一.文件的打开和关闭 open(文件名,访问模式) cloese() 模式 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针 ...
- "%Error opening tftp://255.255.255.255/network config"
问题:服务配置错误消息(Service Configuration Error Messages) 有时,在通过Cisco IOS软件启动Cisco设备期间,会显示与这些类似的错误消息: %Error ...
- 802.1X基本配置
基本的802.1X部署工作包括以下4步: 1. 为Cisco Catalyst交换机配置802.1X认证方 2. 为交换机配置访客VLAN或者受限VLAN,并调整802.1X定时器(可选) ...
- IIS 7.5 URL重写参数
URL 重写规则由以下部分组成: 模式 - 可以理解为规则,分通配符和正则匹配 条件 - 可以理解为字符串 操作 - 操作用于指定如果URL字符串与规则模式匹配并且满足所有规则条件时应 ...
- Java面向对象编程 -2
成员属性封装 在类之中的组成就是属性和方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性需要较高的安全性,所以往往需要对其进行保护 这个时候就需要采用封装性对属性进行保护. 在 ...
- linux可执行程序调试
gdb调试不用多说 ./testapp 2>%261 适合线上问题排查,可打印程序错误接口代码 ldd testapp 查看代码动态链接程序是否正常
- 【读书笔记】图解HTTP完整流程
1.1 使用 HTTP 协议访问 Web: 根据 Web 浏览器地址栏中指定的URL,从服务端获取资源等信息,在页面上展示. Web 使用一种 HTTP (超文本传输协议)作为规范,完成从客户端到服务 ...
- mssql-osql
mssql导入单行字段值非常长,或者sql文件非常大,比如上百M或者更大,常规方法是导不进去的,所以推荐下面方式进行导入. osql -S . -U sa -P 123456 -d TS_TEST - ...
- Java的下载与安装
下载Java 如果要是想聊天,那我们就需要腾讯QQ,先把它下载过来安装上,就可以聊天了,那如果是想要开发java程序呢,我们就需要下载一个开发工具包“jdk”,安装上就可以开发了.当然java是属于哪 ...
- Matlab利用subplot绘制多个图像
利用subplot绘制多个图像 subplot(m,n,p) subplot是将多个图画到一个平面上的函数,m是行,n是列,p是所要绘制图所在的位置 x = 0:0.1:100; sinY = sin ...