P3017 学习笔记

省流:建议降绿(但是诡异洛谷不支持相邻难度修改

题目传送门

这不一眼二分吗????

带上一个前缀和处理就行。

所以说要降绿。。。

code
/**********************************************************
 * Author        : dingziyang888
 * Website       : https://www.luogu.com.cn/problem/
 * Created Time  :
 * FileName      :
 * Warning!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * 1.MLE?
 * 2.array size enough?
 * 3.long long?
 * 4.overflow long long?
 * 5.multiple task cleaned?
 * 6.freopen?
 * 7.TLE?
 * *******************************************************/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iterator>
#include <map>
#include <unordered_map>
#include <queue>
#include <string>
#include <cstring>
#include <set>
#include <bitset>
#include <unordered_set>
#include <vector>
#include <deque>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <list>
#include <array>
#include <iterator>
#include <cmath>
#include <new>
#include <random>
#include <cfloat>
#include <cstdlib>
#include <climits>
#include <numeric>
#include <complex>
#include <ctime>
#include <chrono>
#include <thread>
#include <mutex>
#include <future>
#include <exception>
#include <stdexcept>
#include <cstdint>
#include <cassert>
#include <stack>
#include <cctype>
#define DEBUG
#define Ofile(s) freopen(s".in", "r", stdin), freopen (s".out", "w", stdout)
#define Cfile(s) fclose(stdin), fclose(stdout)
#define fast ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;

using ll = long long;
using ull = unsigned long long;
using lb = long double;

constexpr int mod = 998244353;
constexpr int maxn = 505;

int r, c, a, b, ans;

int k[maxn][maxn], pre[maxn][maxn];

bool check(int mid){
	int sum, tot, cnt, lst;
	sum = tot = cnt = lst = 0;
	for (int i = 1; i <= r; i++){
		sum = cnt = 0;
		for (int j = 1; j <= c; j++){
			sum += pre[i][j] - pre[lst][j];
			if (sum >= mid)
				++cnt, sum = 0;
		}
		if (cnt >= b)
			lst = i, ++tot;
	}
	return tot >= a;
}

int main() {
	fast;
	freopen("std.in", "r", stdin);
	freopen("std.out", "w", stdout);
	cin >> r >> c >> a >> b;
	for (int i = 1; i <= r; i++)
		for (int j = 1; j <= c; j++)
			cin >> k[i][j];
	for (int i = 1; i <= r; i++)
		for (int j = 1; j <= c; j++)
			pre[i][j] = pre[i - 1][j] + k[i][j];
	int l = 0, ri = 1e9;
	while (l <= ri){
		int mid = (l + ri) >> 1;
		if (check(mid))
			ans = mid, l = mid + 1;
		else 
			ri = mid - 1;
	}
	cout << ans;
	return 0;
}
posted @ 2026-02-10 10:02  constexpr_ll  阅读(4)  评论(0)    收藏  举报