Python 在给定大输入的情况下,如何在4秒内执行此代码?

Python 在给定大输入的情况下,如何在4秒内执行此代码?,python,performance,Python,Performance,注意:我不能使用任何不是python内置的外部模块 问题: 一个新的和即将到来的艺术家有一个独特的方式来创建棋盘格图案。我们的想法是 使用一块M-X-N画布,最初完全是黑色的。然后艺术家反复选择 一行或一列,并沿该行或该列运行其魔刷。画笔变了 行或列中每个单元格的颜色从黑色到金色或从金色到黑色。 根据艺术家的选择,你的工作是确定图案中出现多少黄金 由这些选择决定 输入规范 第一行输入为正整数M。第二行输入为正整数 整数N。第三行输入为正整数K。其余输入为 K线表示艺术家所做的选择。这些行中的每一

注意:我不能使用任何不是python内置的外部模块

问题:

一个新的和即将到来的艺术家有一个独特的方式来创建棋盘格图案。我们的想法是 使用一块M-X-N画布,最初完全是黑色的。然后艺术家反复选择 一行或一列,并沿该行或该列运行其魔刷。画笔变了 行或列中每个单元格的颜色从黑色到金色或从金色到黑色。 根据艺术家的选择,你的工作是确定图案中出现多少黄金 由这些选择决定

输入规范

第一行输入为正整数M。第二行输入为正整数 整数N。第三行输入为正整数K。其余输入为 K线表示艺术家所做的选择。这些行中的每一行都将遵循R 由一个空格,然后是一个整数,它是一个行号,或者C后跟一个空格 然后是一个整数,它是一个列数。行从1到M自上而下编号。 列从左到右从1到N编号

输出规格

输出一个非负整数,该整数等于表中的黄金单元格数 图案由艺术家的选择决定

限制

M和N最多可为5 000 000

K可以高达1 000 000

我的解决方案

导入系统 原始输入=sys.stdin.readline m=int(原始输入() n=int(原始输入() 笔刷=原始输入() 笔划=[] 颜色=[[B'表示范围内(n)]表示范围内(m)] 对于范围内的i(int(画笔)): g=原始输入().分割(“”) 如果冲程计数(g)=1: 行程。移除(g) 其他: 笔划追加(g) def更改列(数量、颜色、索引): 如果num==0: 返回颜色 颜色[num-1][index]=“G”如果颜色[num-1][index]=“B”否则“B” num-=1 更改列(数量、颜色、索引) def countGold(c、选项、i): 如果选项==[]: s=0 对于c中的l: s+=l.计数(“G”) 印刷品 返回 面积=选项[i][0] 时间=整数(选项[i][1])-1 如果面积==“R”: c【次】=列表(“”。加入(c【次】)。替换(“G”,“A”)。替换(“B”,“G”)。替换(“A”,“B”)) elif面积==“C”: 更改列(m、c、次) 选项。删除(选项[i]) countGold(c、期权、i) countGold(颜色、笔划、0) 除了一些问题,一切都好。我超过了4秒的时间限制。我知道制作
颜色
需要很多时间。有没有办法在不生成2d阵列的情况下执行此操作

更新的代码(不起作用)

导入系统 M=int(输入()) N=int(输入()) K=int(输入() dup=[] numR=0 numC=0 对于范围(K)内的i: choice=input().split() 如果选择不在dup中: 如果选项[0]=“R”: numR+=1 elif选项[0]=“C”: numC+=1 重复追加(选项) 打印((M*numR)+(N*numC)-(2*numR*numC))
让我把评论中的所有讨论都放到代码中:

导入系统 M=int(输入()) N=int(输入()) K=int(输入() dup=set() 结果={'numR':0,'numC':0} def更新(字符,数字): 如果char=='R': 结果['numR']+=num elif char=='C': 结果['numC']+=num 对于范围(K)内的i: choice=input().split() 如果在dup中选择: 重复删除(选项) 更新(选项[0],-1) 其他: 重复添加(选项) 更新(选项[0],1) numR=结果['numR'] numC=结果['numC'] 打印((M*numR)+(N*numC)-(2*numR*numC))
由于某种原因,Freakish发送的代码仍然不起作用。下面是一个有效的更新代码:

导入系统 rw=sys.stdin.readline M=int(rw()) N=int(rw()) 选项=集合() K=int(rw()) 对于范围(K)内的i: g=输入() 如果g在选项中: 选择。删除(g) 其他: 选择。添加(g) numR=0 numC=0 s=0 选择中的选择: 如果选项[0]=“R”: numR+=1 elif选项[0]=“C”: numC+=1 选择中的选择: 如果选项[0]=“R”: #numR+=1 s+=N-numC elif选项[0]=“C”: #numC+=1 s+=M-numR 印刷品
请将此设置为一个。您尚未在代码中定义笔划。@Aryamcarthy抱歉,现在已修复此问题。这是一个算法问题。以下是一些观察结果:所有这些操作都是可交换的,也就是说,我们可以按照自己的意愿重新排列它们。第二:我们可以先看行(或列)。这将为我们提供标记行X的总数,这将为我们提供XM黄金单元格。然后我们看一下列,这给了我们标记列Y的总数,这给了我们标记单元格YN的总数。然后我们需要去掉交点,也就是YX。总公式为XM+YN-XY。记住要处理重复的行和列。你们根本不需要构造和填充矩阵。@freakish所以假设有4列5行。模式是r2、r1、r3、c1和c4。我们已经标记了第1、2、3行和第1、4列。公式是:3(4)+2(5)-3(2)?@AK-10CA-GlenforestSS2172是的,我想是的(请仔细检查)。最终结果是16。请注意,输入中可能有重复项,即R2、R2、R1、R3、C1、C4。这给了你2(4)+2(5)-2(2)=14。重复项相互抵消。