中国(北方)大学生程序设计训练赛(第一周)(Problem D: 数学题-二分+双指针)
2017-03-06 11:02
302 查看
Description
现在有两个数组 A 和 B, 分别包含x与y个元素。
定义一个新的数组 C,C中包含x×y个元素,为A中所有元素除以B中所有元素。
求C中的第k大元素。
n,m<=100000,k<=n*m
二分答案,
利用双指针,可以把求一次>c的数的个数化为线性的
现在有两个数组 A 和 B, 分别包含x与y个元素。
定义一个新的数组 C,C中包含x×y个元素,为A中所有元素除以B中所有元素。
求C中的第k大元素。
n,m<=100000,k<=n*m
二分答案,
利用双指针,可以把求一次>c的数的个数化为线性的
#include <iostream> #include <cmath> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <map> #include <functional> #include <cstdlib> #include <queue> #include <stack> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=Pre[x];p;p=Next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (100000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define SI(a) ((a).size()) typedef long long ll; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (123456) ll n,m,k; ll a[MAXN],b[MAXN]; bool check(double c) { ll tot=0,p=0; For(i,n) { while (p<=m && a[i]>=(double)b[p+1]*c) ++p; tot+=p; } return tot>=k; } int main() { // freopen("D.in","r",stdin); int T=read(); while(T--) { scanf("%lld%lld%lld",&n,&m,&k); For(i,n) a[i]=read(); For(i,m) b[i]=read(); sort(a+1,a+1+n); sort(b+1,b+1+m); double l=0,r=1e8,ans; while(r-l>1e-9) { double m=(l+r)/2; if (check(m)) l=ans=m; else r=m; } printf("%.2lf\n",r); } return 0; }
相关文章推荐
- 中国(北方)大学生程序设计训练赛(第一周)(Problem B: 埃蒙的时空航道-最小割转dp+贪心)
- 中国(北方)大学生程序设计训练赛(第一周)-D (二分)
- 中国(北方)大学生程序设计训练赛(第一周)E. water problem
- 中国(北方)大学生程序设计训练赛(第一周)(Problem E: Water Problem-矩阵快速幂)
- 中国(北方)大学生程序设计训练赛(第一周)(Problem F: 等差区间-线段树+等差数列平方和公式)
- 中国(北方)大学生程序设计训练赛(第一周)E. water problem
- 矩阵快速幂-中国(北方)大学生程序设计训练赛(第一周)Water Problem
- 中国(北方)大学生程序设计训练赛(第二周)(Problem C: A Water Problem-dp)
- 中国(北方)大学生程序设计训练赛(第一周) (D E)
- 中国(北方)大学生程序设计训练赛(第一周)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem A: Common Substrings-hash)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem G: Connected Components-并查集)
- 中国(北方)大学生程序设计训练赛(第一周)-F(线段树)
- 中国(北方)大学生程序设计训练赛(第二周)(Problem B: A Boring Game-乱搞)
- 中国(北方)大学生程序设计训练赛(第一周)-A(生成树计数)
- 等差区间(写的很脑残)——中国(北方)大学生程序设计训练赛(第一周)F
- 中国(北方)大学生程序设计训练赛(第二周) (A B D G)
- 中国(北方)大学生程序设计训练赛(第三周)(Interesting sequence-找规律)
- 中国(北方)大学生程序设计训练赛(第三周)(List likes playing card-期望)
- 第六届福建省大学生程序设计竞赛 Problem J RunningMan【数学】