问题描述

跳房子,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一。
跳房子是在N个格子上进行的,CYJ对游戏进行了改进,该成了跳棋盘,改进后的游戏是在一个N行M列的棋盘上进行,并规定从第一行往上可以走到最后一行,第一列往左可以走到最后一列,反之亦然。每个格子上有一个数字。
在这个棋盘左上角(1,1)放置着一枚棋子。每次棋子会走到右、右上和右下三个方向格子中对应上数字最大一个。即任意时刻棋子都只有一种走法,不存在多个格子同时满足条件。
现在有两种操作:
move k 将棋子前进k步。
change a b e 将第a行第b列格子上的数字修改为e。
请对于每一个move操作输出棋子移动完毕后所处的位置。

输入

第一行包含两个正整数N,M(3<=N,M<=2000),表示棋盘的大小。
接下来N行,每行M个整数,依次表示每个格子中的数字ai,j。
接下来一行包含一个正整数Q(1<=Q<=5000),表示操作次数。
接下来m行,每行一个操作,其中1<=a<=N,1<=b<=M,1<=k,e<=109。

输出

对于每个move操作,输出一行两个正整数x,y,即棋子所处的行号和列号。

输入输出样例

样例输入

4 4
1 2 9 3
3 5 4 8
4 3 2 7
5 8 1 6
4
move 1
move 1
change 1 4 100
move 1

样例输出

4 2
1 3
1 4

数据范围

10%的数据满足:3<= N,M <=50,Q<=5000, k<=10;
20%的数据满足:3<= N,M <=200,Q<=5000,k<=5000;
另有20%的数据满足:3<= N,M <=200,Q<=5000,k<=109;
100%的数据满足:3<= N,M <=2000,Q<=5000,e,k<=109;

记录第一列第i行能走到位置jump[i],询问时先一行一行的走,每次走到jump[i]行第一列,
不足一行时一步一步走,修改时暴力重构jump数组

代码

#include <cstdio>
#include <limits>#define MAX 2000int R, C;
int a[MAX][MAX];
int pos_r = 0, pos_c = 0;
int jump[MAX];int Fix(int x, int X) {return (x % X + X) % X;
}int NextRow(int r, int c) {int next_row = -1;int max_value = -1;for (int rr = r - 1; rr <= r + 1; ++rr) {const int value = a[Fix(rr, R)][Fix(c + 1, C)];if (value > max_value) {max_value = value;next_row = rr;}}return next_row;
}int RunToFirstColumn(int r, int c) {do {r = Fix(NextRow(r, c++), R);} while (c < C);return r;
}struct Interval {Interval() = default;Interval(int lo, int hi) : lo(lo), hi(hi) {}bool IsEmpty() const { return lo > hi; }int Size() const { return hi - lo + 1; }bool Contains(int x) const { return lo <= x && x <= hi; }int lo = std::numeric_limits<int>::max();int hi = std::numeric_limits<int>::min();
};void Update(int r, int c) {const int target_row = RunToFirstColumn(r, c);Interval rows(r, r);int cc = c;while (cc > 0) {--cc;Interval new_rows; for (int rr = rows.lo - 1; rr <= rows.lo + 1; ++rr) {if (rows.Contains(NextRow(rr, cc))) {new_rows.lo = rr;break;}}for (int rr = rows.hi + 1; rr >= rows.hi - 1; --rr) {if (rows.Contains(NextRow(rr, cc))) {new_rows.hi = rr;break;}}if (new_rows.IsEmpty()) return;rows = new_rows;}if (rows.Size() >= R) {for (int rr = 0; rr < R; ++rr) {jump[rr] = target_row;}} else {for (int rr = rows.lo; rr <= rows.hi; ++rr) {jump[Fix(rr, R)] = target_row;}}return;
}void SuperWalk(int k) {static int walk_id = 0;static int last_walk_id[MAX];static int last_k[MAX];++walk_id;if (k >= C - pos_c) {k -= C - pos_c;pos_r = RunToFirstColumn(pos_r, pos_c);pos_c = 0;}while (k >= C) {k -= C;pos_r = jump[pos_r];if (last_walk_id[pos_r] == walk_id) {const int cycle_len = last_k[pos_r] - k;if (k >= cycle_len) {const int n_cycles = k / cycle_len;k -= n_cycles * cycle_len;}}last_walk_id[pos_r] = walk_id;last_k[pos_r] = k;}while (k--) {pos_r = Fix(NextRow(pos_r, pos_c++), R);}
}int main() {scanf("%d%d", &R, &C);for (int r = 0; r < R; ++r) {for (int c = 0; c < C; ++c) {int k;scanf("%d", &k);a[r][c] = k;}}for (int r = 0; r < R; ++r) {jump[r] = RunToFirstColumn(r, 0);}int Q;scanf("%d", &Q);for (int qq = 0; qq < Q; ++qq) {static char command[16];scanf("%s", command);if (command[0] == 'm') {int k;scanf("%d", &k);SuperWalk(k);printf("%d %d\n", pos_r + 1, pos_c + 1);} else {int r, c, k;scanf("%d%d%d", &r, &c, &k); --r; --c;a[r][c] = k;for (int rr = r - 1; rr <= r + 1; ++rr) {Update(Fix(rr, R), Fix(c - 1, C));}}}return 0;
}

转载于:https://www.cnblogs.com/shulker/p/9656427.html

九校联考-长沙市一中NOIP模拟Day1T2 跳房子(jump)相关推荐

  1. 九校联考-长沙市一中NOIP模拟Day2T2 走格子(cell)

    问题描述 CYJ想找到他的小伙伴FPJ,.CYJ和FPJ现在位于一个房间里,这个房间的布置可以看成一个N行M列的矩阵,矩阵内的每一个元素会是下列情况中的一种: 障碍区域-这里有一堵墙(用'#'表示). ...

  2. 九校联考-长沙市一中NOIP模拟Day1T1 矩阵游戏(game)

    问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,-M,第二行的数字是M+1,M+2-2M,以此类推,第N行的数字是(N-1)M+1,(N-1)M+2-N ...

  3. 九校联考-长沙市一中NOIP模拟Day2T1 旋转子段(rotate)

    问题描述 ZYL有N张牌编号分别为1, 2,--,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点. 旋转可以被认为是将其中的 ...

  4. 九校联考-长沙市一中NOIP模拟Day1T3 优美序列(sequence)

    问题描述 Lxy养了N头奶牛,他把N头奶牛用1..N编号,第i头奶牛编号为i.为了让奶牛多产奶,每天早上他都会让奶牛们排成一排做早操.奶牛们是随机排列的.在奶牛排列中,如果一段区间[L,R]中的数从小 ...

  5. 九校联考-长沙市一中NOIP模拟Day2T3 柱状图(column)

    问题描述 WTH 获得了一个柱状图 , 这个柱状图一共有 N 个柱子 , 最开始第 i 根柱子的高度为 x i , 他现在要将这个柱状图排成一个屋顶的形状 , 屋顶的定义如下 : 屋顶存在一个最高的柱 ...

  6. 九校联考-DL24 凉心模拟 Day1T3 三米诺 (tromino)

    题目描述 金企鹅同学非常擅长用 1×21×21×2 的多米诺骨牌覆盖棋盘的题.有一天,正在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺 (domino)",那么三个格子的的 ...

  7. 九校联考-DL24凉心模拟Day1T3 三米诺 (tromino)

    题目背景 金企鹅同学非常擅长用1*2的多米诺骨牌覆盖棋盘的题.有一天,正 在背四六级单词的他忽然想:既然两个格子的积木叫"多米诺(domino)",那 么三个格子的的积木一定叫&q ...

  8. 九校联考-DL24凉心模拟Day2T1 锻造(forging)

    1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆都打不过了. 勇者的精灵路由器告诉 ...

  9. 【九校联考-24凉心模拟】锻造(forging)

    题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打, 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自 己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他 ...

  10. 九校联考-DL24 凉心模拟 Day2T1 锻造 (forging)

    题目描述 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他自己 ...

最新文章

  1. 星际2正在等待暴雪服务器的响应,win7系统玩星际2一直停留在"正在更新暴雪启动器"页面的解决方法...
  2. 例子 客户端_服务端也是可以主动向客户端推送数据的--WebSocket
  3. VTK:vtkAnnotatedCubeActor用法实战
  4. MySQL笔记-CURRENT_TIMESTAMP()和ON UPDATE及索引相关
  5. JQuery如何与数据库交互
  6. ENC28J60 驱动开发要点
  7. 二月草的博客开通啦……
  8. web安全深度剖析知识点总结
  9. MARQUEE 字符滚动条效果
  10. 全网首发:FFMpeg使用NVIDIA DECODER,解码后的数据转换为YUV420P
  11. 《数据结构》(C语言版)知识点梳理
  12. 【金融科技前沿】金融实人认证+基于百度AI的身份证图片批量OCR识别
  13. 数据分析案例--淘宝用户行为分析
  14. 易班登陆接口接入实例
  15. 对JavaScript中的 事件 进行疯狂 处理
  16. 2016 西班牙 国家德比(西甲31轮)
  17. 单机魔域显示服务器未启动,魔域单机版_开始游戏
  18. 从国内跳槽至新加坡工作的经验分享
  19. ssh: Bad configuration option: usedns
  20. MyBatis查询缓存

热门文章

  1. 俄亥俄州立大学计算机硕士申请,俄亥俄州立大学计算机科学与工程理学硕士研究生申请要求及申请材料要求清单...
  2. 计算机专业 在职跨英语,英语在职研究生跨专业可以吗?
  3. Excel怎么隔列设定不同的背景颜色
  4. 声音文件格式、常见的数字音频格式
  5. 项目之间Cookie的共享
  6. pycharm如何更换背景图片
  7. 利用计算机Tracert,计算机网络 Tracert 命令
  8. 多线程学习-基础( 十)一个synchronized(){/*代码块*/}简单案例分析
  9. 笑话生成器_爸爸笑话发生器
  10. 2018-2019年全球专业服务机器人销售额增长32%,达到112亿美元