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. Android Studio中如何创建AIDL

    实现客户端添加Book,Service接收并打印出书籍信息 一.创建Book类 1.创建文件夹(本文命名为aidl) 2.创建Book类并继承Parcelable接口(原因:AIDL只能传送继承Par ...

  2. 实现JSON数据的存储和读取

    事前准备: //创建一个Crime类 public class Crime { private String mTitle; private UUID mUUID; private Date mDat ...

  3. Linux系统重启network服务失败

    问题描述 使用KVM通过修改配置文件配置好网卡IP,使用命令行service network restart 重启网络服务失败. 如图: 使用图形化管理工具配置IP,在系统界面右上角可以看到网卡状态为 ...

  4. mac下配置java环境

    1.tomcat配置 http://www.cnblogs.com/freeyiyi1993/p/3436368.html 2.下载eclipse和jdk安装  jdk去oracle网站下载

  5. 倒计时 NAN 问题

    http://blog.csdn.net/lishangua/article/details/51506821

  6. umdh工具使用

    先安装工具,http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 选择其中的http://msdn.microsoft.com/ ...

  7. sql 多条件查询 拼接字符串 改成 普通查询格式

    set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROC [dbo].[usp_SRV_CheckServiceDemandOrder] ) = ...

  8. 编程内功修炼之数据结构—BTree(二)实现BTree插入、查询、删除操作

    1 package edu.algorithms.btree; import java.util.ArrayList; import java.util.List; /** * BTree类 * * ...

  9. Qt开发初步,循序渐进,preRequest for 蓝图逆袭

    1,使用Qt面向对象类继承创建第一个窗口主部件,使用setMinimumSize(),setMaximumSize()配置主部件窗口是否能够resize;

  10. 轻松实现语音识别的完整代码在android开发中

    苹果的iphone 有语音识别用的是Google 的技术,做为Google 力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大. * C ...