[gym102770L]List of Products
有一个很重要的性质:若$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的更多相关文章
- Building third-party products of OpenCascade
Building third-party products of OpenCascade eryar@163.com Available distributives of third-party pr ...
- 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 ...
- 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 ...
- magento添加多个产品到购物车(Add multiple products to cart )
Step 1app\design\frontend\base\default\template\catalog\product\list.phtml<?php $_productColl ...
- 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 ...
- 读书笔记-《Training Products of Experts by Minimizing Contrastive Divergence》
Training Products of Experts by Minimizing Contrastive Divergence(以下简称 PoE)是 DBN 和深度学习理论的 肇始之篇,最近在爬梳 ...
- /users/products.:format 这种写法的其对应解析字符写法
“products.:format" 这种写法可以有对应的下面两种路由形式 /products.json /products.xml "products.:format?" ...
- 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 ...
- Popular Products
Popular Products 描述 Given N lists of customer purchase, your task is to find the products that appea ...
随机推荐
- 洛谷3769[CH弱省胡策R2]TATT (KDTree)(四维LIS)
真是一个自闭的题目(调了一个上午+大半个下午) 从\(WA\)到\(WA+TLE\)到\(TLE\)到\(AC\) 真的艰辛. 首先,这个题,我们可以考虑直接上四维KDTree来解决. 对于kdtre ...
- C++ 与 Visual Studio 2019 和 WSL(二)
终端 A more integrated terminal experience | Visual Studio Blog (microsoft.com) Say hello to the new V ...
- gin 源码阅读(5) - 灵活的返回值处理
gin 源码阅读系列文章列表: gin 源码阅读(1) - gin 与 net/http 的关系 gin 源码阅读(2) - http请求是如何流入gin的? gin 源码阅读(3) - gin 路由 ...
- Java并行任务框架Fork/Join
Fork/Join是什么? Fork意思是分叉,Join为合并.Fork/Join是一个将任务分割并行运行,然后将最终结果合并成为大任务的结果的框架,父任务可以分割成若干个子任务,子任务可以继续分割, ...
- Pytorch——张量 Tensors
张量 Tensors 1.torch.is_tensor torch.is_tensor(obj) 用法:判断是否为张量,如果是 pytorch 张量,则返回 True. 参数:obj (Object ...
- JavaScript中的模式匹配
JavaScript中的模式匹配 模式是用于转换输入数据的规则. 以将数据与一个或多个逻辑结构进行比较,将数据分解为各个构成部分,或以各种方式从数据中提取信息. 安装 JavaScript已经实现模式 ...
- js基础学习之"=="与"==="的区别
var a = 1; var b = 1; var c = "1"; 1. "==" 可理解为相等运算符.相等运算符比较时,会自己进行类型转换,等于什么类型就会 ...
- 2021.7.28考试总结[NOIP模拟26]
罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...
- webshell绕过D盾
PHP常见的代码执行函数: eval() assert() preg_replace() create_function() array_map() call_user_func() call_use ...
- python re:正向肯定预查(?=)和反向肯定预查(?<=)
参考资料:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html (?=pattern) 正向肯定预查,在任何匹配pattern的字符串 ...