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. 解决Linux文档显示中文乱码问题以及编码转换

    解决Linux文档显示中文乱码问题以及编码转换 解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打 ...

  2. data stage走起

    如题,希望以后可以找到相应的工作.(已经工作3年以上了)

  3. [方法] Windows 下SSH远程连接Linux

    考虑到Linux服务器自带SSH服务,并且SSH服务开机启动. 因此,方法如下: 安装putty 输入Linux服务器IP地址 此外,如果想远程重启Linux服务器,在命令行中输入reboot即可.

  4. android手机上安装apk时出现解析包错误的一个解决办法

    今天下午在学习安卓开发时,学习开发文档中的gridview时,在模拟器上调试程序一切正常,如下图所示: 但当将bin目录下的HelloGridView.apk拷贝到M8安卓系统后进行安装时,出现了“解 ...

  5. mysql DBI 事务控制

    事务: 事务是任何健壮数据库系统的基本组成,它们 防止错误和数据库腐败通过确保有关数据的改变是原子发生的(不可分割的,要么所有要么什么都不做) 这个章节应用于数据库支持事务和 AutoCommit 是 ...

  6. L1 正则 和 L2 正则的区别

    L1,L2正则都可以看成是 条件限制,即 $\Vert w \Vert \leq c$ $\Vert w \Vert^2 \leq c$ 当w为2维向量时,可以看到,它们限定的取值范围如下图: 所以它 ...

  7. #include <iomanip>

    1 setfill 2 setprecision 3 setw 1 setfill setfill( 'c' ) 设填充字符为c ▲setfill(char c) 用法 : 就是在预设宽度中如果已存在 ...

  8. MySQL- InnoDB锁机制

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  9. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

    实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...

  10. 关于在用Swift开发iOS时如何隐藏NavigationBar和TabBar

    举个例子:如果我有一个页面需要进入时同时隐藏NavigationBar和TabBar,那么我就在那个页面的ViewController的代码里加上下面的代码.就可以实现了.接下来告诉大家每一块要注意的 ...