洛谷 T6476 涂色游戏

洛谷T6476涂色游戏的算法思路
博客介绍了洛谷T6476涂色游戏的解决方案,通过分析题目,发现颜色以p1和p2的最小公倍数为周期循环。关键在于比较在一个大周期内,以p2为小周期的p1数量与k的关系。通过引入偏移量g,找到p1的数量,并与k比较,最终确定解答。涉及到的关键算法为贪心算法和最大公约数计算。

题目描述:

在这里插入图片描述

思路:

10^20个格子,乍一看很多,但是仔细一想就会发现,这些格子中的颜色以p1和p2的最小公倍数为周期循环出现。所以我们只需要关注一个循环中的情况即可。
不妨设p1 < p2,那么在[0, p2]这个区间上就会有这样的场景:
在这里插入图片描述
不难想到,我们可以比较一个大周期中的以p2为一个循环的小周期中的p1个数和k的大小来来判断答案。即判断:
(p2 - 1) / p1 __ k
但是根据上图,我们又不难看出,将所有的p1向右平移一个单位长度,原本在“0”上的p1就会加入p1的总数中去。也就是说,在一个小周期中,p1的个数会随着p1在这个周期中的“起点”变化而变化,如下图:
在这里插入图片描述
因此,我们还需要设置一个偏移量g,其含义为所有p1相对于每个小周期的起点向右移动的距离,即:
p1 * x - p2 * y = g,其中x和y为非负整数。
那么,g的最小值就是p1和p2的最大公约数gcd(p1, p2)。
这样一来,只需要再算一下这一段上的p1个数再和k比较即可,即:
(p2 - 1 - g) / p1 + 1 __ k

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using
LGP9715「QFOI R1」头 普及+/提高 O2优化 线性数据结构 原创 线段树 月赛 链表 离线处理 标准IO 传统题 来源 时间限制 1000ms 内存限制 512MB 通过/尝试次数 108/273 题目背景 可以看看这个讨论:https://www.luogu.com.cn/discuss/703835。 题目描述 小 R 是一个可爱的女孩子。有一天,她在被摸头时,突然灵光乍现,便随手加强了一道题给你做。 这道题的名字叫涂色游戏。初始时你有一个 n n 行 m m 列的网格,所有格子上都没有颜色。有 k k 种颜色的刷子,颜色编号为 1 ∼ k 1∼k。然后给出 q q 次操作,每次操作给出 o p , l , r , c , t op,l,r,c,t 五个参数: 如果 o p = 1 op=1,表示将第 l ∼ r l∼r 行的所有格子涂成颜色 c c。 如果 o p = 2 op=2,表示将第 l ∼ r l∼r 列的所有格子涂成颜色 c c。 如果 t = 0 t=0,意味着如果涂色时遇到已经被染色的格子,就不再进行染色。 如果 t = 1 t=1,意味着如果涂色时遇到已经被染色的格子,就用新的颜色覆盖它。 在所有涂色操作结束以后,对于每种颜色,求出有多少个格子被染成了这种颜色。 输入格式 第一行四个整数 n , m , k , q n,m,k,q,表示行数、列数、颜色数和操作数。 接下来 q q 行,每行五个整数 o p , l , r , c , t op,l,r,c,t,表示这次操作的参数。 输出格式 一行 k k 个整数,第 i i 个整数表示被染成颜色 i i 的格子数量。 输入 #1 复制 5 5 2 4 1 2 4 1 0 2 4 5 1 1 2 2 4 2 0 1 1 1 2 1 输出 #1 复制 17 7 输入 #2 复制 5 5 3 6 2 1 3 3 1 2 2 4 1 0 1 4 4 2 0 2 1 1 1 0 1 2 5 2 0 1 1 5 3 0 输出 #2 复制 5 4 16 提示 样例 1 1 解释 用浅灰色表示颜色 1 1,灰色表示颜色 2 2。 涂色过程如图所示: 共有 17 17 个区域被染成颜色 1 1, 7 7 个区域被染成颜色 2 2。 数据范围 本题共 20 20 个测试点,每个测试点 5 5 分。 对于全部数据,保证 1 ≤ n , m , q ≤ 2 × 10 6 1≤n,m,q≤2×10 6 , 1 ≤ k ≤ 5 × 10 5 1≤k≤5×10 5 , o p ∈ { 1 , 2 } op∈{1,2},若 o p = 1 op=1 则 1 ≤ l ≤ r ≤ n 1≤l≤r≤n,若 o p = 2 op=2 则 1 ≤ l ≤ r ≤ m 1≤l≤r≤m, 1 ≤ c ≤ k 1≤c≤k, t ∈ { 0 , 1 } t∈{0,1}。 对于测试点 1 ∼ 3 1∼3:保证 n , m , k , q ≤ 200 n,m,k,q≤200。 对于测试点 4 ∼ 6 4∼6:保证 n , m , k , q ≤ 2 × 10 3 n,m,k,q≤2×10 3 。 对于测试点 7 ∼ 9 7∼9:保证 n , m , k , q ≤ 10 5 n,m,k,q≤10 5 , o p = 1 op=1。 对于测试点 10 ∼ 12 10∼12:保证 n , m , k , q ≤ 10 5 n,m,k,q≤10 5 , t = 1 t=1。 对于测试点 13 ∼ 18 13∼18:保证 n , m , k , q ≤ 10 5 n,m,k,q≤10 5 。 对于测试点 19 ∼ 20 19∼20:无特殊限制。c++
09-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值