有一个很重要的性质:若$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. Java集合——List,Set,Map总结笔记

    1. 集合 Collection 1.1 Java 集合框架 ​ ​ ​ ​ ​ ​ ​ ​ Java 集合框架位于 java.util 包中.Java 集合框架主要包括两种类型的容器,一种是集合(C ...

  2. Oracle基础命令操作总结

    第1章 oracle命令集 1.1 重启数据库 1.1.1 启动数据库 su -root                 切换到oracle安装用户下,我的是root source .bash_pro ...

  3. Analysis Tools(分析工具)

    分析工具 1.叠加分析 # Process: 交集取反 arcpy.SymDiff_analysis("", "", 输出要素类, "ALL" ...

  4. 如何利用Prometheus监控你的应用(此列子是对于golang sdk进行运用)

    Prometheus作为一套完整的开源监控接近方案,因为其诸多强大的特性以及生态的开放性,俨然已经成为了监控领域的事实标准并在全球范围内得到了广泛的部署应用.那么应该如何利用Prometheus对我们 ...

  5. ❤️这应该是Postman最详细的中文使用教程了❤️(新手使用,简单明了)

    ️这应该是Postman最详细的中文使用教程了️(新手使用,简单明了) 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性.而这要求前端开发进 ...

  6. python 类方法 静态方法

    属性: 公有属性  (属于类,每个类一份) 普通属性  (属于对象,每个对象一份) 私有属性    (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...

  7. Win10 配置JDK1.8 (JDK 8)环境变量

    JDK的安装: 1. JDK安装过程中,一般X掉公共JRE,因为JDK包含了JRE:     环境变量的配置: 1. 打开环境变量,编辑系统变量,新建: 变量名:JAVA_HOME 变量值:D:\so ...

  8. vue3.x组件间通信,实用小技巧都在这里

    本想简单写写,没想到说清楚已经变成了一篇很长的帖子,欢迎当笔记搜藏起来. props / emits 父子组件通信 props一般负责向子组件传递数据 下面是一个简单的例子,父组件向子组件传递了一个t ...

  9. eureka服务端和客户端的简单搭建

    本篇博客简单记录一下,eureka 服务端和 客户端的简单搭建. 目标: 1.完成单机 eureka server 和 eureka client 的搭建. 2.完成eureka server 的添加 ...

  10. Noip模拟52 2021.9.13

    T1 异或 比较稳的切掉 观察数据范围,无法线性筛啥的,根号复杂度也会死,于是只能考虑$log$级 然后打表 发现当$n$为$2^i$时的答案是一个可递归数列: $1,3,7,15,31,63,127 ...