当前位置: 首页 > article >正文

D - Pairs 二分+二分

二分的一个小技巧
我们可以先把逻辑🔥大框架 写出来。像下面这样。
因为二分我们要先思考 我们要怎么拿到这个边界值。。
然后再去填充内部验证的逻辑细节。。这样写起来思路会清晰点。

内部就是分三类讨论。。也是单调的 所以再次二分 算个数。
因为i j 和j i 会被反复算。。我们这里没有规定方向。。所以要cnt/2

int a[N];
bool ok(int sum) {
	int cnt = 0;
      for(int i=1;i<=n;++i){
      	if(a[i]>0){};
      	if(a[i]=0){};
      	if(a[i]<0){};
      }

	return cnt >= sum;
};
void solve() {
	cin >> n >> k;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];

	int l = -inf, r = inf;
	while (l < r) {
		int mid = (l + r + 1) >> 1;
		if (ok(mid))
			l = mid;
		else
			r = mid - 1;
	}
	cout << l;
};


然后这里写的二分竟然是左边界。。为啥啊

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll __int128_t
#define ar array<int, 2>
#define arr array<int, 3>
int  n, m, k, inf = 1LL << 61, mod = 998244353;// 1e9+7;
const int N = 5e5 + 50;
int a[N];
bool ok(int mx) {
	int cnt = 0;
	for (int i = 1; i <= n; ++i) {
		if (a[i] > 0) {
			if (a[i]*a[1] > mx)continue;
			int l = 1, r = n;
			while (l < r) {
				int mid = (l + r + 1) >> 1;
				if (a[mid]*a[i] <= mx)
					l = mid;
				else
					r = mid - 1;
			}
			cnt += l - (l >= i);
		};
		if (a[i] == 0) {
			if (mx >= 0)cnt += (n - 1);
		};
		if (a[i] < 0) {
			if (a[i]*a[n] > mx)continue;
			int l = 1, r = n;
			while (l < r) {
				int mid = (l + r) >> 1;
				if (a[mid]*a[i] <= mx)
					r = mid;
				else
					l = mid + 1;
			}
			cnt += n - l + 1 - (l <= i);
		};
	}

	return cnt / 2 >= k;
};
void solve() {
	cin >> n >> k;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	sort(a + 1, a + n + 1);
	int l = -inf, r = inf;
	while (l < r) {
		int mid = (l + r) >> 1;//这边为什么是左边界。。?
		if (ok(mid))//数的是<=mid的个数。
			r = mid ;
		else
			l = mid + 1;
	}
	cout << l;
};



signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout << fixed << setprecision(15);
#ifdef DEBUG
	freopen("../1.in", "r", stdin);
#endif
	//init_f();
	//init();
	//expr();
	// int T; cin >> T; while(T--)
	solve();
	return 0;
}




http://www.kler.cn/a/279793.html

相关文章:

  • SAP主数据删除
  • vue3编程 -动态多开模态框实现方案
  • mac/windows 软件推荐
  • MySql字段有null值与其他值的比较
  • 【JVM】剖析字符串与数组的底层实现(二)
  • 百日筑基第六十天-学习一下Tomcat
  • 网络通信tcp
  • 虚幻5|制作玩家血量,体力(还未编辑,只用于引用)
  • 远程在电脑上玩PS5《黑神话:悟空》?借助极空间实现PS5远程串流攻略
  • Idea_Gitee_傻瓜式教程
  • 探索 Selenium 替代品:自动化测试工具的全面评估
  • [笔记]中间件基础 - 进一步阅读的扩展点
  • 读书学习笔记 # Datawhale X 李宏毅苹果书 AI夏令营
  • 仿华为车机功能之--修改Launcher3,增加横向滑动桌面空白处切换壁纸的功能
  • ## 已解决:亲测有效的 org.xml.sax.SAXNotRecognizedException 异常解决方法
  • 基于STM32设计的校园智慧路灯系统(华为云IOT)(212)
  • Clickhouse集群化(一)k8s集群搭建
  • 装过mr又卸载了,max报错 mrmateralattribs missing dlls
  • 如何通过云图中RPG去计算云图上不同位置的值?
  • 我的《打螺丝闯关》上线啦!想知道怎么做到的吗?