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;
}

浙公网安备 33010602011771号