E. Reverse the Rivers个人题解

这题可以作为二分的板子

Problem - 2036E - Codeforces

二分简单 但是细节绝对不简单

参考文献(https://zhuanlan.zhihu.com/p/533408649

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, k, t, m, num1, num2, maxx, minn;
char op;
vector<vector<int>> g;

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	
	cin >> n >> k >> t;
	g.resize(n + 1, vector<int>(k + 1));
	
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= k; j++)
			cin >> g[i][j];
	
	for (int i = 2; i <= n; i++)
		for (int j = 1; j <= k; j++)
			g[i][j] |= g[i - 1][j];
	
	while (t--) {
		maxx = 1, minn = n;
		cin >> m;
		while (m--) {
			cin >> num1 >> op >> num2;
			int ll = 1, rr = n;
			if (op == '<') {//右边界
				if (g[1][num1] >= num2)
					minn = -1;
				else {
					while (ll < rr) {
						int mid = (ll + rr+1) >> 1;
						if (g[mid][num1] < num2)
							ll = mid;
						else
							rr = mid-1;
					}
					minn = min(minn, ll);
				}
			} 
			else {//左边界
				if (g[n][num1] <= num2)
					minn = -1;
				else {
					while (ll < rr) {
						int mid = (ll + rr) >> 1;
						if (g[mid][num1] <= num2)
							ll = mid + 1;
						else
							rr = mid;
					}
					maxx = max(maxx, ll);
				}
			}
		}
		
		cout << (maxx <= minn ? maxx : -1) << endl;
	}
	
	return 0;
}

边界问题以及+1还是-1都在一题里面 参考文献是从0-n-1我的数组开的是1-n所以有一处不一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值