有一个很重要的性质:若$a\le b$且$c\le d$,则$ac\le bd$

根据这一性质,就可以利用单调性$o(n)$求出小于$a_{x}\cdot b_{y}$的数的个数(先要对$a$和$b$排序)

考虑二分答案,假设答案$ans$满足$l\le ans\le r$,枚举$a_{i}$,利用单调性求出使得$l\le a_{i}\cdot b_{j}\le r$中间的$j$的区间,之后在所有数中随机选择一个作为$mid$,然后统计出比其小的数个数并与$k$判断

考虑时间复杂度,设对于$l$个数,答案为第$k$个,期望变短的长度为$\frac{k^{2}+(l-k)^{2}}{2l}\ge \frac{l}{4}$,即长度期望变为$o(\frac{3}{4}l)$,那么复杂度就是$o(\log_{\frac{4}{3}}nm)=o(\log_{2}mn)=o(\log_{2}n)$

最终时间复杂度为$o(n\sqrt{v}+n\log_{2}n(\log_{2}n+\log_{2}v))$(其中$v$为权值范围,后面的$\log_{2}v$为排序复杂度)

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 struct ji{
5 vector<int>v;
6 bool operator < (const ji &k){
7 int s=min(v.size(),k.v.size());
8 for(int i=0;i<s;i++)
9 if (v[i]!=k.v[i])return v[i]>k.v[i];
10 return v.size()<k.v.size();
11 }
12 bool operator == (const ji &k){
13 if (v.size()!=k.v.size())return 0;
14 for(int i=0;i<v.size();i++)
15 if (v[i]!=k.v[i])return 0;
16 return 1;
17 }
18 }o,a[N],b[N];
19 int t,n,m,x,y,st[N],ed[N];
20 long long k;
21 ji div(int k){
22 o.v.clear();
23 for(int i=2;i*i<=k;i++)
24 while (k%i==0){
25 k/=i;
26 o.v.push_back(i);
27 }
28 if (k>1)o.v.push_back(k);
29 return o;
30 }
31 ji merge(ji x,ji y){
32 o.v.clear();
33 for(int i=0,j=0;(i<x.v.size())||(j<y.v.size());)
34 if ((i!=x.v.size())&&((j==y.v.size())||(x.v[i]<y.v[j])))o.v.push_back(x.v[i++]);
35 else o.v.push_back(y.v[j++]);
36 return o;
37 }
38 int query(ji k){
39 int ans=0;
40 for(int i=1,j=m;i<=n;i++){
41 while ((j)&&(k<merge(a[i],b[j])))j--;
42 ans+=j;
43 }
44 return ans;
45 }
46 int sum(ji k){
47 int ans=0;
48 for(int i=1,j=m;i<=n;i++){
49 while ((j)&&(k<merge(a[i],b[j])))j--;
50 int s_i=i,s_j=j;
51 while ((j)&&(k==merge(a[s_i],b[j])))j--;
52 while ((i)&&(k==merge(a[i],b[s_j])))i++;
53 ans+=(i-s_i)*(s_j-j);
54 }
55 return ans;
56 }
57 long long calc(ji k){
58 long long ans=1;
59 for(int i=0;i<k.v.size();i++)ans*=k.v[i];
60 return ans;
61 }
62 int main(){
63 srand(time(0));
64 scanf("%d",&t);
65 while (t--){
66 scanf("%d%d%lld",&n,&m,&k);
67 for(int i=1;i<=n;i++){
68 scanf("%d",&x);
69 a[i]=div(x);
70 }
71 for(int i=1;i<=m;i++){
72 scanf("%d",&x);
73 b[i]=div(x);
74 }
75 sort(a+1,a+n+1);
76 sort(b+1,b+m+1);
77 ji l=merge(a[1],b[1]),r=merge(a[n],b[n]);
78 while (1){
79 int tot=0;
80 st[0]=ed[0]=m;
81 for(int i=1;i<=n;i++){
82 st[i]=st[i-1];
83 while ((st[i]>1)&&(!(merge(a[i],b[st[i]-1])<l)))st[i]--;
84 ed[i]=ed[i-1];
85 while ((ed[i])&&(r<merge(a[i],b[ed[i]])))ed[i]--;
86 tot+=ed[i]-st[i]+1;
87 }
88 if (tot==sum(l)+sum(r))break;
89 tot=rand()%tot+1;
90 for(int i=1;i<=n;i++)
91 if (ed[i]-st[i]+1<tot)tot-=ed[i]-st[i]+1;
92 else{
93 x=i;
94 y=st[i]+tot-1;
95 break;
96 }
97 ji mid=merge(a[x],b[y]);
98 if (query(mid)<=k)l=mid;
99 else r=mid;
100 }
101 long long ans=1;
102 for(int i=0;i<l.v.size();i++)ans*=l.v[i];
103 printf("%lld\n",ans);
104 }
105 }

[gym102770L]List of Products的更多相关文章

  1. Building third-party products of OpenCascade

    Building third-party products of OpenCascade eryar@163.com Available distributives of third-party pr ...

  2. SharePoint Configuration Wizard - Unable to upgrade SharePoint Products and Technologies because an upgrade is already in progress

    故障描述 当要运行SharePonit Products and Technologies Configuration Wizard的时候,出现了如下图所示的错误提示. 错误信息为: Unable t ...

  3. Registry values for ProductID and LocaleID for AutoCAD and the vertical products

    原文地址:http://adndevblog.typepad.com/autocad/2013/08/registry-values-for-productid-and-localeid-for-au ...

  4. magento添加多个产品到购物车(Add multiple products to cart )

    Step  1app\design\frontend\base\default\template\catalog\product\list.phtml<?php    $_productColl ...

  5. FVDI Commander products be replaced SVDI tools,really?

    You may have heard that some FVDI Commander products are being replaced by the new SVDI tools. This ...

  6. 读书笔记-《Training Products of Experts by Minimizing Contrastive Divergence》

    Training Products of Experts by Minimizing Contrastive Divergence(以下简称 PoE)是 DBN 和深度学习理论的 肇始之篇,最近在爬梳 ...

  7. /users/products.:format 这种写法的其对应解析字符写法

    “products.:format" 这种写法可以有对应的下面两种路由形式 /products.json /products.xml "products.:format?" ...

  8. Amazon.com: NEW VI AND VIM EDITOR KEYBOARD STICKER: Office Products

    Amazon.com: NEW VI AND VIM EDITOR KEYBOARD STICKER: Office Products NEW VI AND VIM EDITOR KEYBOARD S ...

  9. Popular Products

    Popular Products 描述 Given N lists of customer purchase, your task is to find the products that appea ...

随机推荐

  1. 无法解析的外部符号"void_cdecl caffe::caffe_gpu_dot<double>(int,double........)"

    将源码中的.cu文件添加到项目中即可,即使创建的就是NVIDIA的项目,也需要把这些个.cu文件添加进来

  2. Docker-初见

    目录 Docker概述 Docker历史 Docker Docker的基本组成 Docker安装 使用流程 底层原理 Docker的常用命令 Portainer 可视化面板安装 镜像原理之联合文件系统 ...

  3. 题解 CF1172E Nauuo and ODT

    题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有颜色,定义 \(\text{dis}(u,v)\) 为两个点之间不同颜色个数,有 \(m\) 次修改,每次将某个点的颜色进行更改,在每次操 ...

  4. 树莓派4B学习札记

    防静电 树莓派比较容易被静电损坏,要做好以下预防措施 使用的时候不要用手去触摸PCB和针脚!特别是上电之后! 拿板卡的时候,要习惯性拿板卡的边缘 勤洗手,勤摸墙壁,释放身上的静电 系统安装 8GB以上 ...

  5. javascript-vue介绍

    vue.js是一个用于创建web交互页面的库 从技术角度讲,vue专注于MVVM模型的viewModel层,它通过双向数据绑定把view层和model层连接起来,实际DOM封装和输出格式都被抽象为Di ...

  6. 【Spring】Spring重要类层次图

  7. 【UE4 C++】打印字符串与输出日志

    打印屏幕 默认打印屏幕 // 打印至屏幕 FString screenMessage = "(AddOnScreenDebugMessage) Hello world!"; GEn ...

  8. Java RMI学习与解读(一)

    Java RMI学习与解读(一) 写在前面 本文记录在心情美丽的一个晚上. 嗯.就是心情很美丽. 那为什么晚上还要学习呢? emm... 卷... 卷起来. 全文基本都是根据su18师傅和其他师傅的文 ...

  9. Python使用阿里云OSS服务

    Python使用阿里云OSS服务 前言: 在远程搭建了一个平台,通过改远程平台进行数据的采集,需要将数据内容传送至本地进行处理:为了实现该功能,考虑了阿里云的OSS对象储存的服务. 40G包月只需1元 ...

  10. [no_code][Beta]设计和计划

    2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 Beta设计和计划 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体 ...