Codeforces 263E

原题

题目描述:一个\(n \times m\)的矩阵,每格有一个数,给出一个整数\(k\),定义函数\(f(x, y)\):

\[f(x, y)=\sum_{i=1}^{n} \sum_{j=1}^{m} a_{i, j} \cdot max(0, k-|i-x|-|j-y|) (k \leq x \leq n-k+1, k \leq y \leq m-k+1)
\]

求使\(f(x, y)\)最大的一个二元对\((x, y)\)

solution

我表示只会暴力部分和

1、\(\sum_{p=1}^{i} a_{i-p+1, j}\)

2、\(\sum_{p=1}^{k} a_{i-p+1, j}*(k-p+1)\)

3、\(\sum_{p=1}^{k} a_{i-p+1, j+p-1}\)

4、以图为例,\(k=3, (3, 4)\)为红色圈住的部分每个数*1

5、以图为例, \(k=3, (3, 4)\) 为 $ ( ( 4 + 6 + 7 ) \times 1+ ( 2 + 6 ) \times 2+ 8 \times 3) $

然后旋转三次, 每次算的时候减去最高那列(图为减去第4列),加起来就是答案了。

AC的人中好像有更神的算法,就是把图斜着看,那就是求正方形的和了。

code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <complex>
#include <set>
#include <map>
#include <stack>
using namespace std; const int maxn=1010;
typedef long long LL; int n, m, lim;
int a[maxn][maxn], tmpa[maxn][maxn];
LL f[maxn][maxn], tmpf[maxn][maxn];
LL sum[maxn][maxn][7]; void init()
{
scanf("%d%d%d", &n ,&m, &lim);
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
scanf("%d", &a[i][j]);
}
void prepare()
{
int fi=max(n, m);
for (int i=1; i<=fi; ++i)
for (int j=1; j<=fi; ++j)
for (int k=1; k<=5; ++k)
sum[i][j][k]=0;
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
{
//row and once
sum[i][j][1]=sum[i-1][j][1]+a[i][j];
//row and in order
LL up=(i-1>=lim? sum[i-1-lim][j][1]:0);
sum[i][j][2]=sum[i-1][j][2]-(sum[i-1][j][1]-up)+LL(lim)*a[i][j];
//bevel
sum[i][j][3]=sum[i-1][j+1][3]+a[i][j];
//triangle and once
up=(i>=lim? sum[i-lim][j][3]:0);
LL L;
if (j-1>=lim) L=sum[i][j-lim][3];
else
L=(i-(lim-(j-1))>0? sum[i-(lim-(j-1))][1][3]:0); sum[i][j][4]=sum[i][j-1][4]-(L-up)+sum[i][j][1]-(i>=lim? sum[i-lim][j][1]:0);
//triangle and in order
sum[i][j][5]=sum[i][j-1][5]-sum[i][j-1][4]+sum[i][j][2];
}
}
void turn()
{
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
tmpa[i][j]=a[i][j];
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
a[m-j+1][i]=tmpa[i][j]; for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
tmpf[i][j]=f[i][j];
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
f[m-j+1][i]=tmpf[i][j];
swap(n, m);
}
void solve()
{
for (int i=1; i<=4; ++i)
{
prepare();
for (int j=1; j<=n; ++j)
for (int k=1; k<=m; ++k)
f[j][k]+=sum[j][k][5]-sum[j][k][2];
turn();
}
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
f[i][j]+=a[i][j]*lim; int x=0, y=0;
LL ans=-1;
for (int i=lim; i<=n-lim+1; ++i)
for (int j=lim; j<=m-lim+1; ++j)
if (f[i][j]>ans)
{
x=i; y=j;
ans=f[i][j];
}
printf("%d %d\n", x, y);
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
init();
solve();
return 0;
}

Codeforces 263E的更多相关文章

  1. CodeForces 263E Rhombus

    洛谷题目页面传送门 & CodeForces题目页面传送门 给定一个$n$行$m$列的矩阵,第$i$行$j$列为$a_{i,j}$,以及一个常数$s\in\left[1,\left\lceil ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. Python练习_更改配置文件(3)

    学习完成第三阶段,我们来写一个功能:也就是实现对配置文件的backend字段进行增删改查 1.查 输入:www.oldboy.org 获取当前backend下的所有记录 2.新建 输入: arg = ...

  2. Java 集合嵌套List of List

    在LeetCode上遇到这样返回值 public class Solution { public List<List<Integer>> levelOrder(TreeNode ...

  3. Java之线程的控制

    1. join线程: 在线程执行过程中,有时想让另一个线程先执行,比如将一大问题分割成许多小问题,给每一个小问题分配线程,但所有小问题处理完后再让主线程进一步操作.此时我们可以在主线程中调用其它线程的 ...

  4. tornado web框架

    tornado web框架 tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web ...

  5. ejs简单教程

    ejs learning nodejs的模板引擎有很多, ejs是比较简单和容易上手的.常用的一些语法: 用<%...%>包含js代码 用<%=...%>输出变量 变量若包含 ...

  6. Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)

    ----我的生活,我的点点滴滴!! 部门领导突然心血来潮,想在android平台上做应用,但是我们大多产品属于嵌入式(本吊只负责写写应用,苦比的被强行顶过来搞这,由于这还得领导吵了一架,架虽然吵完了, ...

  7. php快递查询

    http://www.oschina.net/code/snippet_60100_25087 <?php class Express { private $expressname =array ...

  8. Linux学习笔记1:配置Linux网络和克隆虚拟机并更改配置

    一.配置Linux网络 在安装Linux的时候,一定要保证你的物理网络的IP是手动设置的,要不然会在Linux设置IP连通网络的时候会报network is unreachable 并且怎么也找不到问 ...

  9. html表单提交的几种方法

    原文地址:http://www.ijser.cn/?p=34 最普通最经常使用最一般的方法就是用submit type..看代码: <form name=”form” method=”post” ...

  10. gcc中-pthread和-lpthread的区别

    最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!!!然后man了一下,才发现在gcc 4.7中链接线程库使用-pt ...