[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 ...
随机推荐
- MIPS流水线技术
华中科技大学 - 计算机硬件系统设计 单周期指令运行动态 Instruction Fetch Instruction Decode Execution MEM Write Back 单周期时空图 设耗 ...
- 第五课第四周笔记1:Transformer Network Intuition 变压器网络直觉
目录 Transformer Network Intuition 变压器网络直觉 Transformer Network Intuition 变压器网络直觉 深度学习中最令人兴奋的发展之一是 Tran ...
- 【二食堂】Beta - Scrum Meeting 3
Scrum Meeting 3 例会时间:5.15 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续完成文本区域划词添加的功能 issue 1. 划词功能已经实现,继续开发 ...
- 期望dp好题选做
前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...
- 嵌入式STM32的GPIO口工作模式的介绍
一.输入模式 1. 浮空输入 浮空输入模式下,上拉和下拉两个开关断开,高或低电平通过施密特触发器到达输入数据寄存器,CPU可以通过读取输入数据寄存器从而读取到外部输入的高低电平值. 2. 输入上拉模式 ...
- https的加密解密过程
前置知识 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题.后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实 ...
- 栈的压入、弹出顺序 牛客网 剑指Offer
栈的压入.弹出顺序 牛客网 剑指Offer 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是 ...
- hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)
题意: X坐标上有n个数.JOHN想知道有多少对数满足:x[a]-x[b]<=k(题意给)[a<b] 思路: 额,,,直接看代码吧,,,, 代码: int T,n,k; int x[100 ...
- JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象
public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...
- linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式
当我们说一个CPU是"16位"或"32"位时,指的是处理器中"算数逻辑单元"(ALU)的宽度.数据总线通常与ALU具有相同的宽度.当Inte ...