C# 这个代码可以进一步优化,这样我就不会在竞争网站上超过时间限制或TLE?

C# 这个代码可以进一步优化,这样我就不会在竞争网站上超过时间限制或TLE?,c#,performance,optimization,bitwise-operators,bitwise-xor,C#,Performance,Optimization,Bitwise Operators,Bitwise Xor,在一个有竞争力的编码网站上,我遇到了这个问题。我能够用下面的代码解决基本用例。但是,对于较大的输入,时间限制已经超过,我尝试减少循环的数量,但所花费的时间仍然是2秒左右,然而,限制仅为1秒 是否有进一步的范围来优化此代码?比如,我们可以删除嵌套循环吗 static void Main(string[] args) { string[] first = (Console.ReadLine()).Split(null); //Sample input -

在一个有竞争力的编码网站上,我遇到了这个问题。我能够用下面的代码解决基本用例。但是,对于较大的输入,时间限制已经超过,我尝试减少循环的数量,但所花费的时间仍然是2秒左右,然而,限制仅为1秒

是否有进一步的范围来优化此代码?比如,我们可以删除嵌套循环吗

static void Main(string[] args)
    {
        string[] first = (Console.ReadLine()).Split(null);          //Sample input -  3 1 2 2 3
        int N = int.Parse(first[0]);
        int X = (int.Parse(first[1]) - 1);
        int Y = (int.Parse(first[2]) - 1);
        int Z = (int.Parse(first[3]) - 1);
        int T = (int.Parse(first[4]) - 1);
        string second = Console.ReadLine();                         // Sample input - 1 2 3
        List<int> list = new List<int>();

        //Converting string inputs to int
        list = second.Split().Select(str => int.Parse(str)).ToList();

        List<int> xorList = new List<int>();
        int xor = 0;
        int temp = 0;
        //Calculate the digits(using bitwise AND) of sub-matrix only, instead of entire matrix, and in the same loop, calculate bitwise XOR also.
        for (int i = X; i <= Z; i++)
        {
            for (int j = Y; j <= T; j++)
            {
                temp = list[i] & list[j];
                xor ^= temp;                    
            }
        }            
        Console.WriteLine(xor);            
    }
static void Main(字符串[]args)
{
string[]first=(Console.ReadLine()).Split(null);//示例输入-3 1 2 3
int N=int.Parse(第一个[0]);
int X=(int.Parse(first[1])-1);
int Y=(int.Parse(first[2])-1);
intz=(int.Parse(first[3])-1);
int T=(int.Parse(first[4])-1);
string second=Console.ReadLine();//示例输入-1 2 3
列表=新列表();
//将字符串输入转换为int
list=second.Split().Select(str=>int.Parse(str)).ToList();
List xorList=新列表();
int-xor=0;
内部温度=0;
//只计算子矩阵的数字(使用按位和),而不是整个矩阵,并且在同一循环中,也计算按位异或。

对于(inti=X;i首先,让我们假设问题是布尔数而不是整数

然后一种看待问题的方法是,在我们感兴趣的子矩阵的顶部有一些布尔值,在它的左侧有一些布尔值。如果顶部布尔值为真,垂直线为真,侧面布尔值为真,水平线为真:

然后,任务是计算交叉点的数量,并确定该数字是偶数(结果:零)还是奇数(结果:一)

现在更明显的是,这可以不用一个接一个地计算出来,它可以通过将顶部的真实布尔数乘以侧面的真实布尔数来实现。事实上,我们可以按位计算这些数字的和,因为乘积的最低有效位与数据的最低有效位相同数字的和

这只需要线性时间来计算X..Z和Y..T范围内的真实布尔数

要解决完整问题,请对所有32位整数执行此操作。当然,执行此操作有一个快捷方式,因为不需要完整计数(只需要计数的最低有效位),也不需要完整乘积

也许你更喜欢一种代数解释,那么一种理解这一点的方法是,我们使用和分布在XOR上的事实将
a&d^a&e^a&f^b&d^b&e^b&f^c&d^c&e^c&f
(一个3x3示例)重写为
(a^b^c)和(d^e^f)

总的来说

horizontal = XOR of list[X .. Z]
vertical = XOR of list[Y .. T]
result = horizontal & vertical

2秒?用于此简单计算(假设样本输入)?你也在计算编译时间吗?@JHBonarius先生,2秒用于大输入。请参见编辑。先生,我理解我正在尝试的是最幼稚的方法,只是按照问题所说的去做。但是这种方法只适用于小输入。要解决大输入,我们需要算法中的一些智能快捷方式。我是sus我想在按位和按位OR的组合中一定会有一些陷阱。是的,它确实有效,但超过了1秒的时间限制。你能为你的方法发布一些伪代码吗?