[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 ...
随机推荐
- 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)
一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...
- 洛谷3244 落忆枫音 (拓扑图dp+式子)
题目大意就是 给你一个DAG 然后添加一条边\(x->y\) ,询问以1为根的生成树的个数 QWQ 首先假设没有添加的边 答案就应该是 \[ans=\prod_{i=1}^{n} in[i] \ ...
- iOS平台 | 快速集成华为AGC认证服务
介绍 如何让用户根据已有的账号来进行登录注册呢?在应用中集成华为AGC认证服务SDK来轻松快速地实现这个功能. 本篇内容根据官网文档指导集成过程总结完成,关于集成步骤,官网的资料写的有点多,现在我总结 ...
- NC105 二分查找法
二分查找(一) 二分查找看似简单,但是有很多的细节要注意. 题目是牛客NC105,找到有序数组中第一个大于或者等于所查找的数字. 初步写了如下的代码: class Solution { public: ...
- 新產品SWOT分析實例
推出新产品需要解决四个行销支柱: 价格 产品 促销 销售地点 要分析这些方面,请检查您的优势.劣势.机会和威胁,以帮助您在运行第一个广告或举行第一次促销之前将风险降至最低,并最大限度地利用资源.SWO ...
- NKOJ-2936 城市建设
问题描述: PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国 ...
- 计算机中的contex理解
原文链接 https://www.xuebuyuan.com/2016635.html 1.其实简单的说就是跟当前主题有关的所有内容. 2.如说到程序的上下文,就是当前这段程序之上和之下的程序段.因 ...
- uvm_cookbook--DUT-Testbench Connections--Abstract-Concrete Class Connections
抽象和具体class的连接 An alternative to using a virtual interface handle for DUT to UVM testbench connection ...
- C#笔记1__命名空间 / 常量 / object / is、as、...?... :...
命名空间:namespace Test1{ ... } 引用命名空间:using System; using 别名=命名空间 常量:const double PI=3.14; using System ...
- ES6-变量的解构赋值复习+学习
ES6------变量的解构赋值 由于之前学过ES6的解构赋值,但是只是略看了一点网上的视频,所以今天就看了看ES6对这一部分的详细介绍,然后做一个总结的笔记. 首先,先大概说一下什么是变量的解构赋值 ...