[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 ...
随机推荐
- 教你轻松构建基于 Serverless 架构的小程序
前言 自 2017 年第一批小程序上线以来,越来越多的移动端应用以小程序的形式呈现.小程序触手可及.用完即走的优点,大大降低了用户的使用负担,也使小程序得到了广泛的传播.在阿里巴巴,小程序也被广泛地应 ...
- DistSQL:像数据库一样使用 Apache ShardingSphere
Apache ShardingSphere 5.0.0-beta 深度解析的第一篇文章和大家一起重温了 ShardingSphere 的内核原理,并详细阐述了此版本在内核层面,特别是 SQL 能力方面 ...
- 基于linux在线预览
1.Libreoffice安装 在服务器上安装Libreoffice,在这里就不多说了, import os import sys import subprocess import re def co ...
- el-scrollbar滚动条置底
<el-scrollbar ref="leftScrollbar" style="height: 600px"></el-scrollbar& ...
- vue基础-组件&插槽
组件 组件化的意义:封装(复用,把逻辑隐藏起来,提高可维护性),快速开发(搭积木) 约定:我们通常把那些除了HTML标签以外的自定义组件,才称为'组件',结论是,我们说"父组件"& ...
- Vite启动后提示Network: use `--host` to expose
当使用 Vite 构建项目后,发现只有localhost + 端口 服务,没有 IP + 端口服务. 运行npm run dev,终端提示Vite启动后提示Network: use '--host' ...
- poi实现生成下拉选联动
在我们实际的程序开发中,经常需要用到从excel导入数据中系统中,而为了防止用户在excel中乱输入文字,有些需要用到下拉选的地方,就需要从程序中动态生成模板.本例子简单的讲解一下,如何生成级联下拉选 ...
- POJ 1442 Air Raid(DAG图的最小路径覆盖)
题意: 有一个城镇,它的所有街道都是单行(即有向)的,并且每条街道都是和两个路口相连.同时已知街道不会形成回路. 可以在任意一个路口放置一个伞兵,这个伞兵会顺着街道走,依次经过若干个路口. 问最少需要 ...
- hdu 5100 Chessboard (额,,,,,就叫它趣味数学题吧)
题意: 用K*1的砖块去覆盖N*N的大矩形,问最多能覆盖多少块. 详细证明:(转载自matrix67) Matrix67: The Aha Moments 趣题:用 k × 1 的矩形覆盖 n × n ...
- OAuth 2.0 的探险之旅
前言 OAuth 2.0 全称是 Open Authorization 2.0, 是用于授权(authorization)的行业标准协议. OAuth 2.0 专注于客户端开发人员的简单性,同时为 W ...