首页 > 其他分享 >题解 序列合并

题解 序列合并

时间:2023-07-19 12:14:47浏览次数:46  
标签:int 题解 LL 合并 while long 最小值 序列

题目链接

首先不难想到,最小数的一定是 \(a_1+b_1\),次小的数是 \(a_1+b_2\) 和 \(a_2+b_1\) 中小的。

得出结论,若 \(a_i+b_j\) 是第 \(k\) 小,那么 \(a_{i+1}+b_j\) 和 \(a_i+b_{j+1}\) 有可能成为第 \(k+1\) 小。

这是一个很优秀的性质,这意味着我们可以通过最小值推出次小值,再通过次小值推出次次小值,以此类推。

结合前面,我们已知最小值 \(a_1+b_1\),那么关键在于如何找出所有可能候选答案中的最小值,这可以用优先队列实现。

注意 \(a_1+b_2\) 和 \(a_2+b_1\) 同时可以推出 \(a_2+b_2\),所以注意去重,这可以用 \(set\) 维护二元组实现。

时间复杂度 \(O(n\log n)\).

#include<bits/stdc++.h>
using namespace std;

#define PII pair<int,int>
typedef long long LL;
typedef unsigned long long ULL;

LL read() {
    LL sum=0,flag=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
    while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
    return sum*flag;
}

const int N=1e5+10;
int n,a[N],b[N];
struct node {
    int x,y;
    friend bool operator < (node s1,node s2) {
        return a[s1.x]+b[s1.y]>a[s2.x]+b[s2.y];
    }
};
priority_queue<node> q;
set<pair<int,int> > f;

int main() {
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++) {
        cin>>b[i];
    }
    int tot=0;
    q.push({1,1}); f.insert({1,1});
    while(q.size()) {
        node t=q.top(); q.pop();

        cout<<a[t.x]+b[t.y]<<' ';
        tot++;
        if(tot==n) break;
        if(t.x+1<=n&&f.count({t.x+1,t.y})==0) {
            q.push({t.x+1,t.y});
            f.insert({t.x+1,t.y});
        }
        if(t.y+1<=n&&f.count({t.x,t.y+1})==0) {
            
            q.push({t.x,t.y+1});
            f.insert({t.x,t.y+1});
        }
    }
    return 0;
}
/*
*/

类似题目:最小函数值,同样是已知最小值,可以推出次小和次次小等的题目。

标签:int,题解,LL,合并,while,long,最小值,序列
From: https://www.cnblogs.com/zhangyuzhe/p/17565207.html

相关文章

  • “范式杯”2023牛客暑期多校训练营1 蒻蒟题解
    A.AlmostCorrect题意:给定一个01串,要求构造一系列排序操作(xi,yi),使得经过这些排序操作后可以使与给定01串等长的所有其他01串完全排好序,而给定的01串无法完全排好序Solution构造题我们考虑到对0和1的位置进行统计,统计得出最左边的1的位置为l,最右边的0的位置为r我们进行三次......
  • 【SP21463 题解】
    Descirption给定\(n\timesm\)的矩阵,求最大子矩阵的面积满足每一行每一列都构成等差数列。Solution我们另\(up_{i,j}\)表示最小的\(k\)满足\((i,k),(i,k+1),\cdots,(i,j)\)构成等差数列,可以用\(\mathcalO(nm)\)求出。对于一个矩阵的左上角\((a,b)\),右下......
  • python将excel内两列的日期合并
    原excel: 目标将year和month合并:year、month里放的1961等是数字,合并日期的时候需要把它们变成字符串再合并,采用.astype(str)#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Su@file:ceshi.py@time:2023/06/26@desc:"""importpandasaspd#打开excel......
  • 代码随想录算法训练营第57天 | ● 647. 回文子串 ● 516.最长回文子序列 ● 动
     第九章 动态规划part17●  647. 回文子串  ●  516.最长回文子序列●  动态规划总结篇 今天 我们就要结束动态规划章节了,大家激不激动!!!   详细布置   647. 回文子串    动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。https:......
  • 浅谈 OI 中各种合并操作
    前言合并操作一直是OI中一大考点,今天请各位跟着笔者来梳理一下各种合并操作。启发式合并几乎可以说是最经典的合并了。假定我们可以在\(O(k)\)的时间内往某个集合中插入一个数,那么我们就可以在\(O(n\lognk)\)的时间内合并若干个元素总量为\(n\)的集合。集合启发式......
  • BZOJ 1461 题解
    考虑设计一个哈希函数\(hash(x)=f(x)\timesbase^x\)。其中\(f(x)\)表示\(\sum_{j=1}^{i-1}[j<i]\)。然后类似于滑动窗口计算区间哈希值,加入一个数就计算贡献,减去一个数就计算这个数产生了贡献,两个东西都可以树状数组维护,那么愉快做完了。#include<bits/stdc++.h>#de......
  • P5494 题解
    来一发\(O(\logn)\)线性空间的解法。考虑通过只维护线段树叶子节点的虚树的方法压缩空间,考虑记录下每个节点的编号,然后通过异或完求最低位的\(1\)的方式求出LCA的深度,然后记录下LCA右端点的编号。在回收节点的时候可以释放储存右端点编号的空间,但是这里为了方便就不这样......
  • UNR #7 Day2 T1 火星式选拔题解
    放一个比赛链接先考虑打完暴力后\(k=1\)的特殊性质。当队列容量为\(1\)时,队中的人\(i\)会被第一个满足\(i\leqj\)且\(b_i\leqa_j\)的人淘汰,并且队列中的人会变成\(j\),考虑倍增加速这个过程,令\(f_{i,j}\)表示第\(i\)个人进队后淘汰过程发生\(2^j\)次后队......
  • P6684 题解
    真的卡不动了,但是我感觉我的思路还是有一些价值的,就来写一篇题解吧。考虑使用回滚莫队(不增)来维护,当区间删去一个点时相当于全局加入一条边,这个询问的本质是询问是否是二分图,所以考虑扩展值域并查集,这里使用路径压缩加按秩合并,记录下修改,在回滚时全部还原。总复杂度是\(O(n\sqr......
  • 「JOISC 2019 Day4」蛋糕拼接 3 题解
    先考虑这个式子:\(\sum_{j=1}^{M}|C_{k_{j}}-C_{k_{j+1}}|\)一定是在\(C\)有序时取到,具体证明很简单各位读者自己证明。那么现在式子变成:\(\sum{V}+2\times({C_{\max}-C_{\min}})\)这个时候一个常见的技巧是将\(C\)排序。这个时候就可以定义状态:\(dp_{i,j}=\s......