http://codeforces.com/problemset/problem/912/E

题意·n个质数,问因子中只包含这其中几个质数的第k大的数是多少

最显然的想法是暴力搜预处理出所有的小于1e18的值,排序后直接输出,但是n的范围是16,仔细一想发现事实并不可行,不论是时间还是空间都不允许。

本题的难点在于考虑到用折半将其分成两个集合,预处理出每个集合内所有可能的数,由于一个集合最多只有8个,这是一个允许爆搜的范围,与处理完了之后二分出答案即可,check函数里需要用到双指针的技巧来查找给定数字在两个集合乘积中的位置,

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
const double eps = 1e-;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,tmp,sa,sb;
LL K;
int A[maxn],B[maxn];
vector<LL>a,b;
void init(int x[],vector<LL>& y,int sum,LL now,int k){
if(k == sum + ){
y.pb(now);
return;
}
LL ans = ;
while(now <= 1e18 / ans){
init(x,y,sum,now * ans,k + );
if(ans > 1e18 / x[k]) break;
ans *= x[k];
}
}
LL check(LL t){
int cnt1 = a.size(); int cnt2 = b.size() - ;
int tmp1 = ,tmp2 = ;
LL ans = ;
for(int i = ; i < cnt1; i ++){
if(a[i] > t) break;
while(b[cnt2] > t / a[i] && cnt2 >= ) cnt2--;
ans += cnt2 + ;
}
return ans;
}
LL solve(){
LL l = , r = 1e18;
LL ans = ;
while(l <= r){
LL m = (l + r) >> ;
if(check(m) >= K){ r = m - ;
ans = m;
}else {
l = m + ;
}
}
return ans;
}
int main()
{
Sca(N);
sa = sb = ;
For(i,,N){
int x; Sca(x);
if(i & ) A[++sa] = x;
else B[++sb] = x;
}
Scl(K);
init(A,a,sa,,);
init(B,b,sb,,);
sort(a.begin(),a.end());
sort(b.begin(),b.end());
Prl(solve());
#ifdef VSCode
system("pause");
#endif
return ;
}

CodeForces912E 折半+二分+双指针的更多相关文章

  1. codeforces912E(折半搜索+双指针+二分答案)

    E. Prime Gift E. Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes inpu ...

  2. Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)

    题意 : 给你 N ( 1 ≤ N ≤ 16 ) 个质数,然后问你由这些质数作为因子的数 ( 此数不超 10^18 ) & ( 不一定需要其因子包含所给的所有质数 ) 的第 k 个是什么 分析 ...

  3. 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)

    [Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...

  4. HDU 6231 (二分+双指针)

    题意:给一个长度为n的数组,问在由这个数组的所有的区间第k小组成B数组中,第m大元素是多少 解法:这题较难的地方在于转化思维.如果去求所有区间的第k小,最坏复杂度是O(n*n)肯定超时. 这题正确的解 ...

  5. codeforces 880E. Maximum Subsequence(折半搜索+双指针)

    E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standa ...

  6. [BZOJ3277/BZOJ3473] 串 - 后缀数组,二分,双指针,ST表,均摊分析

    [BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连 ...

  7. 二分图hall定理应用+二分+双指针——cf981F(好题)

    /* 二分答案,判mid是否合法 如何判断:如果是在直线上,那么遍历匹配即可 现在在环上,即既可以向前匹配也可以向后匹配,那么将环拆开,扩展成三倍 显然a和b的匹配边是不可能交叉的,因为交叉必定没有不 ...

  8. CF R 635 div2 1337D Xenia and Colorful Gems 贪心 二分 双指针

    LINK:Xenia and Colorful Gems 考试的时候没想到一个很好的做法. 赛后也有一个想法. 可以考虑答案的样子 x,y,z 可以发现 一共有 x<=y<=z,z< ...

  9. <二分查找+双指针+前缀和>解决子数组和排序后的区间和

    <二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 ...

随机推荐

  1. 跟踪分析Linux内核的启动过程

    潘俊洋 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.准备 搭建环境 1 2 ...

  2. The Last Reader Response——13-17

    Hi, everybody, nice to meet you, this is probably my best and meet you at a time, in the past a seme ...

  3. 小学四则运算APP 第二阶段冲刺-第三天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第二次冲刺阶段时间:11.29~12.09 本次发布的是判断题的部分代码 panduanset.java import com.examp ...

  4. 递归拼装Tree结构数据

    @Override public List<Map<String, Object>> queryListTree() { List<Map<String,Objec ...

  5. 基于SSH实现员工管理系统之框架整合篇

    本篇文章来源于:https://blog.csdn.net/zhang_ling_yun/article/details/77803178 以下内容来自慕课网的课程:基于SSH实现员工管理系统之框架整 ...

  6. 菜鸟教程--AJAX

    一.简介1.AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.2.AJAX = 异步 JavaScript 和 XML.3.通过在后台与服务器进行少量数据交换,AJAX 可以使网 ...

  7. PAT L2-012 关于堆的判断

    https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888 将一系列给定数字顺序插入一个初始为空的小顶堆 ...

  8. Java 修饰符顺序问题

    What is a reasonable order of Java modifiers (abstract, final, public, static, etc.)? http://stackov ...

  9. 日常工作: 应用服务器Oracle驱动问题说明

    1. .net使用Oracle驱动的发展等 作为.net线的产品的ERP产品 最初的版本 使用了.net 1.1发布时 微软提供的Oracle的驱动 但是后续微软的.net产品线貌似没有继续发展相应的 ...

  10. Node url模块

    const url = require("url");var u = "https://www.jd.com:443/ad/index?uname=qd";// ...