PS:这是几天前我在洛谷月赛写的一道题,总共四道题,全对的就这一个(太菜了),其他的也就第二题能骗部分分(听说第二题是记忆化,但我还是没看懂,一直超时),下面只有简化题意,具体题意和样例测试详见洛谷,好的,下面我就写一下我的思路。

拿到这题,还是跟以前一样,读题然后分析,(上面的大题干太长了,我也读了半天),大体环境是递加时间的,即若没有操作,一直运行的话,第1秒全体都加1,总和是1,第2秒全体都加2,总和是3,第3秒全体加3,总和是6…… 依次递推,但现在不是简单的加和问题,而是有操作步骤的,并且操作步骤还有条件。

初始时,他会站在一个位置,然后随着时间每秒也进行不同方向的移动,并且他站在哪,那就不能随大环境加当前秒数,即停止加数,并在下一秒他离开该点时重新随秒数加数,只不过再加的不是秒数了,而是从1开始的自然数了,然后问你若干操作后,输出这个矩阵的各项的和的矩阵。怎么做,看一下数据,矩阵最大1000*1000,即1000000的数,若是暴力做,即每次移动后遍历一下这个矩阵然后进行处理肯定不行,数据量太大,那该怎么做。

其实应该很多人跟我想都一样,那我在这里讲一下我的想法,暴力肯定寄,这个矩阵的形式,加上整体加和的外部大环境,我们应该特殊处理里面被走过的点,然后与外面的总和加和,即可得到正确答案。可能我说的有点抽象,我举个例子:例如这是个1000*1000的矩阵,但其中只有一点被走过(假设啊),因为被走过的点要慢于其他没被走过点的点(因为他一旦被走过就会从1开始计数,肯定低于当前时间秒数,也就低于其他人的和),那我只需要标记这点,并计算出他与其他点差了多少,到最后,我们遍历一次这个矩阵,若没被标记,则该点是秒数加和,否则是秒数加和减去其差值,这样就能快速得到答案了,那么接下来我们看一下这该如何实现。

上述方法的难点无非在于如何计算出该点与其他没被遍历的点的差值,我们可以举些例子,下列分别为没被遍历的点的每秒加值和被遍历的点的每秒加值:

没被:   1,  2,  3,  4,  5,  6,  7,  ……

被:       0,  1,  2,  3,  4,  5,  6,  ……

我们可以发现,被遍历过的点,每秒与没被遍历过的点差值是固定的,都是1,我们再举例

没被:    1, 2,  3, 4,  5,  6,  7, ……

被:       1,  2,  3,  0,  1,  2,  3,  ……

这时我们发现虽然部分差值依然固定,但从1变成了4,这是为什么呢?

因为我们第一个样例是在第一秒遍历的,所以差1,而第二个样例是在第四秒遍历的,所以差4,所以我们发现,他的差值跟在第几秒遍历的有关,差值再乘时间不就是总差值了吗,看来我们里答案很近了    但是看下面一组样例:

没被:     1,   2,   3,   4,   5,   6,   7,  ……

被:        0,    1,   2,   0,   1,   2,   3,……

这组样例里,该点被遍历两次,第一次是在第一秒,此时差1,而到第四秒时,该点又被遍历,此时差值又变为4了,这就得特殊处理了,第一次遍历的总差值为3,而 3 = 1 * 3= 1 * ( 4 - 1 )

所以,当有多次遍历发生在同一点时,前一次的差值我们可以直接算出来,为当前秒数减去前一次遍历的秒数的差乘与前一次遍历的时间,这样我们的难题就解决了,下面是总体框架

         要建两个二维数组,一个存放上一次遍历的秒数,另一个记录该点与其他点的差,根据给定字符串按照题意进行行走,若该点没被遍历,则直接存入现在秒数,否则,先计算差值加到另一个数组,然后在存入当前秒数,最后遍历一次矩阵,如果没被遍历过,则该点的值为秒数求和,否则为秒数求和减去存在另一个数组的值,还要减去,最后还要减去最后一次遍历所带来的结果,即总秒数+1-最后一次遍历该点的秒数的差乘与最后一次遍历该点的秒数,因为这个我们没有算,,然后输出答案即可,下见代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[1010][1010],ans[1010][1010];   //f记录秒数,ans记录差值
ll sum,n,m,x,y,t=1;
string u;
int main ()
{cin>>n>>m>>x>>y;getchar();cin>>u;f[x][y]=1;                    //第一秒直接存数处理即可sum=m*(m+1)/2;                //计算总的秒数和for(int i=0;i<u.size();i++){if(i==u.size()-1)         //依据题意,最后一次没有影响,直接跳过continue;t++;if(u[i]=='N')y++;else if(u[i]=='S')y--;else if(u[i]=='W')x--;else if(u[i]=='E')x++;if(f[x][y]==0)f[x][y]=t;else{ans[x][y]-=(t-f[x][y])*f[x][y];     //记录差值,存进ans[]f[x][y]=t;                          //记录秒数}}for(int j=n;j>=1;j--)                      //左下角为(1,1),不是左上角了,注意坐标轴变换{for(int i=1;i<=n;i++){if(f[i][j]==0)                     //没被遍历过cout<<sum;elsecout<<sum+ans[i][j]-(m-f[i][j]+1)*f[i][j];if(i==n)cout<<endl;elsecout<<" ";}}return 0;
}

P8462 「REOI-1」奶油蛋糕相关推荐

  1. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  2. windows系统和linux系统可以使用相同的js代码吗_「React 手册 」在 Windows 下使用 React , 你需要注意这些问题...

    大家好,本篇内容,我要和大家聊聊使用 Windows 开发 React ,你需要注意的一些问题.首先说明下,我不是使用 windows 进行开发,因为其配置开发环境来说不是特别方便,我更喜欢 苹果ma ...

  3. 自己动手,做一款抬头显示的「Todo Hud」

    我用过好多款 TodoList 软件,但事情一多总还是丢三落四,原本计划好要做的事情总是安静地躺在某个角落,等我想起来要去扫一眼的时候,都已快「物是人非」... 要是能在桌面上实时显示 TodoLis ...

  4. 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?

    背景 前几天,我们介绍了 如何利用C# + Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了. 可是,把软件原型提交给对方时,发现对方更希望& ...

  5. 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...

  6. 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画

    作者 | 神经小兮 来源 | HyperAI超神经 头图 | 下载于视觉中国 把影视剧变成漫画,是怎样的一种神操作?来自大连理工大学和香港城市大学的团队,最新提出的 AI 框架,可自动将影视剧转换为漫 ...

  7. 豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」

    来源 | HyperAI超神经 这几天,传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息,不少媒体在争相报道收购进度的同时,也将整起交易的幕后推手 -- 孙正义,放到了聚光灯下. ...

  8. 揭开「拓扑排序」的神秘面纱

    作者 | 小齐本齐 责编 | Carol 来源 | 码农田小齐 Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它 ...

  9. TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败

    整理 | 屠敏 来源 | CSDN(ID:CSDNnews) [导读]在 2020 年初雪来临之际,TIOBE 官方在最新发布的 1 月编程语言榜单中为我们最终揭开了「 2019 年度编程语言」的神秘 ...

  10. 编程语言发展70年,用50种不同语言输出「Hello World」

    「免费学习 60+ 节公开课,投票页面,点击讲师头像」 作者 | Sylvain Saurel 译者 | 风车云马 责编 | 屠敏 [导读]历经 70 年,不断出现的编程语言为开发者解决了哪些难题?其 ...

最新文章

  1. Java开发者需要了解的移动开发编程语言
  2. mongo备份索引_【MongoDB学习之四】索引 聚合 备份与恢复 监控
  3. python3反转列表的三种方式
  4. 设置静态ip上网_开始使用第一步:连上网线换个皮
  5. jQuery mobile 之三
  6. 在Linux下用源码编译安装apache2
  7. 使用Lambda的装饰设计模式
  8. 【Pytorch神经网络理论篇】 01 Pytorch快速上手(一)概述+张量
  9. c#没有指针导致的性能问题研究一二
  10. Nginx实战基础篇一 源码包编译安装部署web服务器
  11. 解决“/dev/mapper/centos-root 100%”满了
  12. 采样干扰十大滤波算法程序大全
  13. go 导出 html 报告(使用 hero 预编译 html 模板引擎)
  14. 大数据工程师和数据分析师有什么区别
  15. HMS Core线上Codelabs挑战赛第二期开始
  16. Android开发实现上一页,下一页显示内容
  17. 短视频底层实操课,让你迅速从短视频新手变成高手
  18. openstack安装newton版本keyston部署(一)
  19. 进制之间的快速转换法:8421码及原码反码补码之间的相互转换关系
  20. 统计分析 -- 正态分布

热门文章

  1. java面向对象题目_经典面向对象题,用Java做,要详细点的。
  2. 使用VGA实现移动方块
  3. Dojo: Quick Start
  4. [BZOJ1061][NOI2008]志愿者招募(费用流神题单纯形裸题)
  5. ITSM系统_CMDB设计_业务要件
  6. 夺命故障!炸出了投资人!
  7. be idle sometimes to_英语美文_双语美文:趁着年轻做自己想做的事_沪江英语
  8. Strategy策略模式详解与实例
  9. 计算机开机只显示,电脑开机黑屏只显示光标怎么办?来看看几种原因分析及解决方法!...
  10. BAS:天牛须搜索智能优化算法