有一个很重要的性质:若$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. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 100005
  4. 4 struct ji{
  5. 5 vector<int>v;
  6. 6 bool operator < (const ji &k){
  7. 7 int s=min(v.size(),k.v.size());
  8. 8 for(int i=0;i<s;i++)
  9. 9 if (v[i]!=k.v[i])return v[i]>k.v[i];
  10. 10 return v.size()<k.v.size();
  11. 11 }
  12. 12 bool operator == (const ji &k){
  13. 13 if (v.size()!=k.v.size())return 0;
  14. 14 for(int i=0;i<v.size();i++)
  15. 15 if (v[i]!=k.v[i])return 0;
  16. 16 return 1;
  17. 17 }
  18. 18 }o,a[N],b[N];
  19. 19 int t,n,m,x,y,st[N],ed[N];
  20. 20 long long k;
  21. 21 ji div(int k){
  22. 22 o.v.clear();
  23. 23 for(int i=2;i*i<=k;i++)
  24. 24 while (k%i==0){
  25. 25 k/=i;
  26. 26 o.v.push_back(i);
  27. 27 }
  28. 28 if (k>1)o.v.push_back(k);
  29. 29 return o;
  30. 30 }
  31. 31 ji merge(ji x,ji y){
  32. 32 o.v.clear();
  33. 33 for(int i=0,j=0;(i<x.v.size())||(j<y.v.size());)
  34. 34 if ((i!=x.v.size())&&((j==y.v.size())||(x.v[i]<y.v[j])))o.v.push_back(x.v[i++]);
  35. 35 else o.v.push_back(y.v[j++]);
  36. 36 return o;
  37. 37 }
  38. 38 int query(ji k){
  39. 39 int ans=0;
  40. 40 for(int i=1,j=m;i<=n;i++){
  41. 41 while ((j)&&(k<merge(a[i],b[j])))j--;
  42. 42 ans+=j;
  43. 43 }
  44. 44 return ans;
  45. 45 }
  46. 46 int sum(ji k){
  47. 47 int ans=0;
  48. 48 for(int i=1,j=m;i<=n;i++){
  49. 49 while ((j)&&(k<merge(a[i],b[j])))j--;
  50. 50 int s_i=i,s_j=j;
  51. 51 while ((j)&&(k==merge(a[s_i],b[j])))j--;
  52. 52 while ((i)&&(k==merge(a[i],b[s_j])))i++;
  53. 53 ans+=(i-s_i)*(s_j-j);
  54. 54 }
  55. 55 return ans;
  56. 56 }
  57. 57 long long calc(ji k){
  58. 58 long long ans=1;
  59. 59 for(int i=0;i<k.v.size();i++)ans*=k.v[i];
  60. 60 return ans;
  61. 61 }
  62. 62 int main(){
  63. 63 srand(time(0));
  64. 64 scanf("%d",&t);
  65. 65 while (t--){
  66. 66 scanf("%d%d%lld",&n,&m,&k);
  67. 67 for(int i=1;i<=n;i++){
  68. 68 scanf("%d",&x);
  69. 69 a[i]=div(x);
  70. 70 }
  71. 71 for(int i=1;i<=m;i++){
  72. 72 scanf("%d",&x);
  73. 73 b[i]=div(x);
  74. 74 }
  75. 75 sort(a+1,a+n+1);
  76. 76 sort(b+1,b+m+1);
  77. 77 ji l=merge(a[1],b[1]),r=merge(a[n],b[n]);
  78. 78 while (1){
  79. 79 int tot=0;
  80. 80 st[0]=ed[0]=m;
  81. 81 for(int i=1;i<=n;i++){
  82. 82 st[i]=st[i-1];
  83. 83 while ((st[i]>1)&&(!(merge(a[i],b[st[i]-1])<l)))st[i]--;
  84. 84 ed[i]=ed[i-1];
  85. 85 while ((ed[i])&&(r<merge(a[i],b[ed[i]])))ed[i]--;
  86. 86 tot+=ed[i]-st[i]+1;
  87. 87 }
  88. 88 if (tot==sum(l)+sum(r))break;
  89. 89 tot=rand()%tot+1;
  90. 90 for(int i=1;i<=n;i++)
  91. 91 if (ed[i]-st[i]+1<tot)tot-=ed[i]-st[i]+1;
  92. 92 else{
  93. 93 x=i;
  94. 94 y=st[i]+tot-1;
  95. 95 break;
  96. 96 }
  97. 97 ji mid=merge(a[x],b[y]);
  98. 98 if (query(mid)<=k)l=mid;
  99. 99 else r=mid;
  100. 100 }
  101. 101 long long ans=1;
  102. 102 for(int i=0;i<l.v.size();i++)ans*=l.v[i];
  103. 103 printf("%lld\n",ans);
  104. 104 }
  105. 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. MIPS流水线技术

    华中科技大学 - 计算机硬件系统设计 单周期指令运行动态 Instruction Fetch Instruction Decode Execution MEM Write Back 单周期时空图 设耗 ...

  2. 第五课第四周笔记1:Transformer Network Intuition 变压器网络直觉

    目录 Transformer Network Intuition 变压器网络直觉 Transformer Network Intuition 变压器网络直觉 深度学习中最令人兴奋的发展之一是 Tran ...

  3. 【二食堂】Beta - Scrum Meeting 3

    Scrum Meeting 3 例会时间:5.15 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续完成文本区域划词添加的功能 issue 1. 划词功能已经实现,继续开发 ...

  4. 期望dp好题选做

    前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...

  5. 嵌入式STM32的GPIO口工作模式的介绍

    一.输入模式 1. 浮空输入 浮空输入模式下,上拉和下拉两个开关断开,高或低电平通过施密特触发器到达输入数据寄存器,CPU可以通过读取输入数据寄存器从而读取到外部输入的高低电平值. 2. 输入上拉模式 ...

  6. https的加密解密过程

    前置知识 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题.后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实 ...

  7. 栈的压入、弹出顺序 牛客网 剑指Offer

    栈的压入.弹出顺序 牛客网 剑指Offer 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是 ...

  8. hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)

    题意: X坐标上有n个数.JOHN想知道有多少对数满足:x[a]-x[b]<=k(题意给)[a<b] 思路: 额,,,直接看代码吧,,,, 代码: int T,n,k; int x[100 ...

  9. JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象

    public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...

  10. linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式

    当我们说一个CPU是"16位"或"32"位时,指的是处理器中"算数逻辑单元"(ALU)的宽度.数据总线通常与ALU具有相同的宽度.当Inte ...