二分 51Nod1105 第K大的数
来源:互联网 发布:本地连接 未识别的网络 编辑:程序博客网 时间:2024/05/29 11:20
传送门:点击打开链接
题意:n<=50000,再给你两个数组A,B,C数组是A[i]*B[j],求第k大
思路:二分。主要想说,,原来在重复的数的有序数组中二分某个数,只要算一次lower_bound就行了- -。。。。
#include<map>#include<set>#include<cmath>#include<ctime>#include<stack>#include<queue>#include<cstdio>#include<cctype>#include<string>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<functional>#define fuck(x) cout<<"["<<x<<"]"#define FIN freopen("input.txt","r",stdin)#define FOUT freopen("output.txt","w+",stdout)using namespace std;typedef long long LL;typedef pair<int, int>PII;const int MX = 5e4 + 5;const int INF = 0x3f3f3f3f;int n, k;LL A[MX], B[MX];LL check(LL x) { LL sum = 0; for(int i = n; i >= 1; i--) { int t = lower_bound(B + 1, B + 1 + n, (x - 1) / A[i] + 1) - B; sum += n - t + 1; if(sum == 0) break; } return sum;}void solve() { LL l = 1, r = A[n] * B[n], m; while(l <= r) { m = (l + r) >> 1; LL f = check(m); if(f < k) r = m - 1; else l = m + 1; } printf("%I64d\n", l - 1);}int main() { //FIN; while(~scanf("%d%d", &n, &k)) { for(int i = 1; i <= n; i++) { scanf("%I64d%I64d", &A[i], &B[i]); } sort(A + 1, A + 1 + n); sort(B + 1, B + 1 + n); solve(); } return 0;}
0 0
- 二分 51Nod1105 第K大的数
- 【51nod1105】【第K大的数】【二分答案】
- 51nod 1105 第K大的数 (二分答案)
- 51nod 1105 第K大的数(二分)
- 51NOD 1105 第K大的数 【二分】
- 51nod 1105 第K大的数【二分】
- 51Nod 1105 第k大的数 二分
- 51nod 1105 第K大的数 二分
- 51 nod 1105 第K大的数 二分套二分
- 51nod 1105 第K大的数 (二分套二分 好题)
- 二分求两个有序数组第k大的数
- 1105 第K大的数 二分搜索
- 51NOD 1105 第K大的数(二分好题)
- 51nod 1105 第K大的数【二分+思维】好题~
- 51nod(第K大的数)
- 第K大的数
- 第k大的数
- 第k大的数
- 黑马程序员——反射的使用
- 列表中循环添加字典出现覆盖现象的问题
- Swift中避免重载的final修饰符
- ShellExecuteEx(&ShExecInfo) 和 WinExec
- hdu5601N*M bulbs
- 二分 51Nod1105 第K大的数
- JDK中的Timer和TimerTask详解
- webBrowser捕获Alert内容(C#)
- java基础
- iOS开发多线程篇—GCD介绍
- [android]_[ListView的基本使用]
- js点击其他地方
- 项目架构strangeioc
- Android官方刷新组件 SwipeRefreshLayout 的使用