首页 > 其他分享 >两序列相乘的第k大元素

两序列相乘的第k大元素

时间:2023-06-02 18:33:47浏览次数:51  
标签:11 int ll 元素 相乘 序列



4875: 第k大数

时间限制: 10 Sec  内存限制: 128 MB


提交: 63  解决: 21


[提交][状态][讨论版]


题目描述


有两个序列a,b,它们的长度分别为n和m,那么将两个序列中的元素对应相乘后得到的n*m个元素从大到小排列后的第k个元素是什么?


输入


输入的第一行为一个正整数T (T<=10),代表一共有T组测试数据。

每组测试数据的第一行有三个正整数n,m和k(1<=n, m<=100000,1<=k<=n*m),分别代表a序列的长度,b序列的长度,以及所求元素的下标。第二行为n个正整数代表序列a。第三行为m个正整数代表序列b。序列中所有元素的大小满足[1,100000]。


输出


对于每组测试数据,输出一行包含一个整数代表第k大的元素是多少。


样例输入


33 2 31 2 31 22 2 11 11 12 2 41 11 1


样例输出


311



【分析】:直接求解很明显数据量太大。

二分枚举。

相乘后的新序列的最大值和最小值很容易得出,然后对这个区间进行二分枚举。

有点像猜数。

对每次猜的数x,求一下有多少个数比x大,直到猜的数恰好有k个数比x大,计算结束。


如何求比x大的数有多少个:

序列a,b都按从大到小排序

设两个下标i=0,j=m-1分别跑a和b;

看代码中的函数 f( ll x ) 就能看懂。

【代码】:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k,T;
ll a[101010],b[101010];
bool cmp(ll c,ll d)
{
    return c>d;
}
ll f(ll x)//统计>=x的数量
{
    ll c=0,j=m-1;
    for(int i=0;i<n;i++)
    {
        while(j&&a[i]*b[j]<x)j--;
        if(a[i]*b[j]>=x)c+=j+1;
    }
    return c;
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k;
        for(int i=0;i<n;i++) scanf("%lld",&a[i]);
        for(int i=0;i<m;i++) scanf("%lld",&b[i]);
        sort(a,a+n,cmp);
        sort(b,b+m,cmp);
        ll mid,r=a[0]*b[0],l=a[n-1]*b[m-1];
        while(l<r)
        {
            mid=(l+r)/2;
            if(f(mid)>=k)
                l=mid+1;
            else r=mid;
        }
        if(f(l)<k)l--;//测试发现有时少1,干脆特判了一下...
        cout<<l<<endl;
    }
}
/**************************************************************
    Problem: 4875
    User: summer17083
    Language: C++
    Result: 正确
    Time:1192 ms
    Memory:3280 kb
****************************************************************/


标签:11,int,ll,元素,相乘,序列
From: https://blog.51cto.com/u_16125110/6404553

相关文章

  • ICPC2017网络赛(南宁)子序列最大权值(树状数组+dp)
    https://nanti.jisuanke.com/t/17319LetSSbeasequenceofintegerss_{1}s1,s_{2}s2,......,s_{n}snEachintegerisisassociatedwithaweightbythefollowingrules:(1)Ifisisnegative,thenitsweightis00.(2)Ifisisgreaterthanorequalto10......
  • lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为
    如何联合索引查询?所以给定查询过滤条件age=18的过程就是先从termindex找到18在termdictionary的大概位置,然后再从termdictionary里精确地找到18这个term,然后得到一个postinglist或者一个指向postinglist位置的指针。然后再查询gender=女的过程也是类似的。最后得出age=18......
  • 表存储时间序列数据存储体系结构
    随着近年来物联网(IoT)的快速发展,时间序列数据出现了爆炸式增长。根据过去两年DB-Engines数据库类型的增长趋势,时间序列数据库的增长是巨大的。这些大型开源时间序列数据库的实现是不同的,并且它们都不是完美的。但是,这些数据库的优点可以结合起来实现完美的时间序列数据库。阿里云表......
  • 一图归纳三大种类矩阵范数:诱导范数,元素范数,Schatten范数,涵盖谱范数,2范数
    转载自:https://blog.csdn.net/qq_27261889/article/details/87902480......
  • 伪元素显示变量值的方法
    1.使用attr引用父元素属性<lidata-name="小明">li::after{content:attr(data-name);}2.非content属性可以直接引用css变量<listyle="--width:40px"></li>li::after{content:attr(data-name);width:var(--width)}3.co......
  • 剑指 Offer II 048. 序列化与反序列化二叉树
    题目链接:剑指OfferII048.序列化与反序列化二叉树方法:先序遍历(dfs)解题思路 在先序遍历过程中,节点值之间通过空格隔开,好利于后续反序列化过程中获取值。代码classCodec{public://Encodesatreetoasinglestring.stringserialize(TreeNode*root){......
  • APP-自动化定位WEB页面元素
    APP定位浏览器这种上下文嵌套的页面时,发现有的元素是无法定位 点击上面的地球图标, 点击NATIVE_APP(原生APP下面的选项),切换到web_view选项。就是使用HTML页面。 但是这个时候会报错,记住报错信息中的版本信息,这里是86.0.4240上图的报错是指缺乏对应版本的驱动;驱动的下载......
  • 序列密码实验
    实验目的及要求(1)实现LFSR,寄存器位数n=10,反馈函数、初试值都自己定;(2)实现RC4,数组长度=8,密钥自己定;(3)基于实现的LFSR或RC4实现一个动态验证码生成器,每次生成6个伪随机十进制数,自己测下多少个输出后开始循环。==================================================================......
  • 经济学:动态模型平均(DMA)、动态模型选择(DMS)、ARIMA、TVP预测原油时间序列价格|附代
    全文链接:http://tecdat.cn/?p=22458最近我们被客户要求撰写关于动态模型平均的研究报告,包括一些图形和统计输出。本文提供了一个经济案例。着重于原油市场的例子。简要地提供了在经济学中使用模型平均和贝叶斯方法的论据,使用了动态模型平均法(DMA),并与ARIMA、TVP等方法进行比较 (......
  • 下一个较大元素II
    现在有一个数组,请找出数组中每个元素的后面比它大的最小的元素,若不存在则为-1。给定一个int数组A及数组的大小n,请返回每个元素所求的值组成的数组。保证A中元素为正整数,且n小于等于1000。测试样例:[11,13,10,5,12,21,3],7[12,21,12,12,21,-1,-1]classNextElement{public:......