2019暑期集训 - Day 5

悲哀的一天





概述

提高 B 组
4题:T0 , T1 , T2 , T3
171.2/400 分
59/161 名


T0 输油管道

WA 66.7/100 分

Description

请你帮忙设计一个从城市 M 到城市 Z 的输油管道,现在已经把整个区域划分为 \(R\)\(C\) 列,每个单元格可能是空的也可能是以下 7 种基本管道之一:
油从城市 M 流向 Z ,‘+’ 型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:

现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。

Input

第一行包含两个整数 \(R\)\(C\ (1\leq R,C\leq 25)\)
接下来 \(R\) 行每行 \(C\) 个字符描述被偷之后的形状,字符分为以下三种:

(1)‘.’ 表示空;
(2)字符 ‘|’ ( ASCII为124 )、‘-’、‘+’、‘1’、‘2’、‘3’、‘4’ 描述管道的形状;
(3)‘M’ 和 ‘Z’ 表示城市,两个都是只出现一次。

输入保证石油的流向是唯一的,只有一个管道跟 M 和 Z 相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
输入保证有解而且是唯一的。

Output

输出被偷走的管道的行号和列号以及管道的类型。

Sample Input

输入1:

3 7
.......
.M-.-Z.
.......

输入2:

3 5
..1-M
1-+..
Z.23.

输入3:

6 10
Z.1----4..
|.|....|..
|..14..M..
2-+++4....
..2323....
..........

Sample Output

输出1:

2 4 -

输出2:

2 4 4

输出3:

3 3 |

Solution

暴力出奇迹

暴搜,如果走着走着无路可走了,说明前面就是被偷走的水管。
枚举这个位置的上下左右,得到这个地方的水管要连接那些方向,得出水管类型。

T1 数码问题

RE 54.5/100 分

Description

Alice有一个 \(N\times N\)的格子,把 \(1-N^2\) 按照从上到下从左到右的顺序填进表格中,允许在表格上进行两种操作:

(1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
(2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。

Alice想把数 \(X\) 移到 \((R,C)\) 处可以采用以下方法:

如果 \(X\) 不在 \(C\) 这一列,通过旋转行操作把 \(X\) 移到 \(C\) 这一列;
如果 \(X\) 不在 \(R\) 这一行,通过旋转列操作把 \(X\) 移到 \(R\) 这一行。

下面是一个把 6 移到 (3,4) 的例子:


Alice 现在想采用上述方法,依次把 \(K\) 个数移到各自的目标位置,编程计算每个数需要几次操作。

Input

第一行包含两个整数 \(N(12\leq N\leq 10000)\)\(K(1\leq K\leq 1000)\)
接下来 \(K\) 行,每行包含三个整数 \(X(1\leq X\leq N^2)\)\(R\)\(C(1\leq R,C\leq N)\),描述需要移动的数以及目标位置。
Alice 必须按照输入顺序依次移动。

Output

输出 \(K\) 行,每行输出一个整数,表示操作次数。

Sample Input

输入1:

4 1
6 3 4

输入2:

4 2
6 3 4
6 2 2

输入3:

5 3
1 2 2
2 2 2
12 5 5

Sample Output

输出1:

3

输出2:

3
5

输出3:

2
5
3

Solution

就比暴力多一点

我们发现,直接暴力模拟会 MLE ,数组开不下来这么大的,所以要换种方式。
比如,我们每次只存储下移动的方式,然后每次询问时再从头推。
建立结构体 move 存储移动的行、列,和移动行的长度、列的长度,每次询问 \(i\) 时先计算出它的原始位置,然后查询它的移动历史并更新坐标,用最终的坐标计算移动长度。

T2 灌水

TLE 50/100 分

Description

学生都很喜欢灌水,第一天只有 Alice 给她的每个朋友灌了一次水,从第二天开始,所有学生(包括 Alice )将会有规律地去灌水:

如果前一天被灌了奇数次的水,他们将会给每个朋友灌一次水;
如果前一天被灌了偶数次的水,他们将会给每个朋友灌两次水。

学生编号为 \(1\)\(N\) ,Alice 为 \(1\) 号,学生之间的朋友关系会给出。
计算 \(H\) 天后一共灌了几次水。

Input

输入一行包含两个整数 \(N\)\(H(1\leq N\leq 20,1\leq H\leq 10^9)\) ,表示学生数和天数。
接下来 \(N\) 行,每行包含 \(N\) 个 ‘0’ 或 ‘1’ ,\((A,B)\) 处的字符表示 \(A\)\(B\) 的关系, ‘1’ 表示是朋友关系, ‘0’ 表示不是。注意自己和自己不是朋友关系,输入保证该矩阵是对称的。

Output

输出 \(H\) 天后一共灌水的数量。

Sample Input

输入1:

4 1
0110
1001
1001
0110

输入2:

4 2
0110
1001
1001
0110

输入3:

5 3
01000
10110
01000
01001
00010

Sample Output

输出1:

2

输出2:

14

输出3:

26

Hint

【样例解释】

样例2 中,第一天 Alice 灌了 2 次水,第二天学生1 和学生4 给学生2 和学生3 都灌了 2 次水,而学生2 和学生3 给学生1 和学生4 各灌水 1 次, 2 天一共灌了 12 次水。

【数据范围】

50% 的数据 \(H\leq 1000\)

Solution

优美的暴力

对于普通暴力,\(H\) 太大,肯定要 TLE ,所以我们需要优化。
注意到 \(N\) 很小,我们又知道每个学生被灌水的情况只有 2 种,奇数和偶数,所以所以学生被灌水的情况至多只有 \(2^N\leq 1048576\) 种组合,也就是说,在 \(1048577\) 次灌水以内一定会出现至少一个重复,而一但又两次灌水后的结果重复,那么就出现了循环,因为每次灌水的结果只与上次有关,如果两次灌水结果相同,那么两个下一次的灌水结果也必定相同。
因此我们找到了一个循环节(在两次结果相同的灌水之间),只需用 \(H\) 除以循环节的长度,得到循环次数,再乘以每个循环节中的灌水次数和,最后加上剩下的部分,就得到答案了。

T3 开花

TLE 7.7/100 分

Description

在遥远的火星上,上面的植物非常奇怪,都是长方形的,每个植物用三个数来描述:左边界 \(L\) 、右边界 \(R\) 以及高度 \(H\) ,如下图所示描述一个植物:\(L=2,R=5\)\(H=4\)

每天都有一个新植物长出来,第一天的植物高度为 \(1\) ,后面每天长出的植物比前一天的高 \(1\)
当一个新植物长出来的时候,跟其他植物的水平线段相交处会长出一朵小花(前提是之前没有长出花朵),如果线段交于端点,是不会长花的。
下图为样例1 的示意图:

给出每天的植物的坐标,计算每天长出多少新花。

Input

第一行包含一个整数 \(N\ (1\leq N\leq 100000)\) ,表示天数。
接下来 \(N\) 行,每行两个整数 \(L\)\(R\ (1\leq L\leq R\leq 100000)\) ,表示植物的左右边界。

Output

输出每天长出新植物后增加新花的数量。

Sample Input

输入1:

4
1 4
3 7
1 6
2 6

输入2:

5
1 3
3 5
3 9
2 4
3 8

Sample Output

输出1:

0
1
1
2

输出2:

0
0
0
3
2

Solution

暴力不行了

线段树
还没搞清楚
留下这篇博客以后看明白了再写题解

Update :
懂了
好吧,这只是线段树模板题。
区间修改,单点查询。





暴力

俗话说得好,骗分过样例,暴力出奇迹
大部分问题用上暴力总能得些分
暴搜可以从从爆0 中拯救下你
今天的 4 题中有 3 题都与暴力有关
暴搜总能给人不一样的惊喜

posted @ 2019-08-31 10:17  imzzy  阅读(67)  评论(0)    收藏  举报