Pagini recente » Cod sursa (job #1565481) | simulare_de_oni_2 | Cod sursa (job #1726552) | Cod sursa (job #1628366) | Cod sursa (job #1528140)
#include <fstream>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>
#include <deque>
#include <limits>
using namespace std;
template <typename Cmp>
class my_deque{
Cmp cmp;
deque<int> buf;
public:
my_deque(Cmp c): cmp(c){}
void push(const int x){
while(!buf.empty() && !cmp(buf.back(), x)){
buf.pop_back(); }
buf.push_back(x); }
void pop(const int x){
if(!buf.empty() && buf.front() == x){
buf.pop_front(); } }
int front(){
return buf.front(); } };
int largest_sum_wider_than(const vector<int>& v, const int min_len, const int max_len){
const int n = v.size();
vector<int> s_part(n+1, 0);
int rez = numeric_limits<int>::min();
auto sort_by_s_part = [&s_part](const int a, const int b){
return s_part[a] < s_part[b]; };
my_deque<decltype(sort_by_s_part)> dq(sort_by_s_part);
if(min_len == 0){
dq.push(0);
rez = 0; }
for(int i = 0; i < n; ++i){
s_part[i+1] = s_part[i] + v[i];
if(i-min_len+1 >= 0){
dq.push(i-min_len+1);
rez = max(rez, s_part[i+1] - s_part[dq.front()]); }
dq.pop(i-max_len); }
return rez; }
int largest_submat(const vector<vector<int> >& v, const int min_r, const int max_r, const int min_c, const int max_c){
const int r = v.size(), c = v[0].size();
vector<vector<int> > s_part_col(r+1, vector<int>(c, 0));
for(int i = 0; i < r; ++i){
for(int j = 0; j < c; ++j){
s_part_col[i+1][j] = s_part_col[i][j] + v[i][j]; } }
vector<int> un_rand(c, 0);
int rez = numeric_limits<int>::min();
for(int i = 0; i+min_r <= r; ++i){
for(int j = i+min_r; j <= r && j <= i+max_r; ++j){
for(int k = 0; k < c; ++k){
un_rand[k] = s_part_col[j][k] - s_part_col[i][k]; }
rez = max(rez, largest_sum_wider_than(un_rand, min_c, max_c)); } }
return rez; }
int cbin(vector<vector<int> >& v, const int min_r, const int max_r, const int min_c, const int max_c){
int st = 0, dr = 100000000, to_add = 0;
for(int step = 1<<(int)log2(dr-st+1); step > 0; step /= 2){
if(st+step <= dr){
{
int delta = to_add-st-step;
for(auto& y : v){
for(auto& x : y){
x += delta; } }
to_add = st+step; }
if(largest_submat(v, min_r, max_r, min_c, max_c) >= 0){
st += step; } } }
return st; }
int main(){
ifstream f("balans.in");
ofstream g("balans.out");
int n, m, r, c;
f >> n >> m >> r >> c;
vector<vector<int> > v(2*n, vector<int>(2*m, 0));
for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
f >> v[i][j];
v[i][j] *= 1000;
v[i+n][j] = v[i][j+m] = v[i+n][j+m] = v[i][j]; } }
g << fixed << setprecision(3) << ((double)cbin(v, r, n, c, m)/1000.0);
return 0; }