在Codeforces 558E上TIME_LIMIT_EXCEEDED

时间:2015-07-22 06:46:48

标签: c++

我是编程领域的初学者,我已经开始解决Codeforces上的问题,这是我的第一个问题,当我使用此代码提交此问题解决方案A Simple Task

#include <iostream>
#include <string>
using namespace std;
void swapchar(char &x, char &y)
{
char temp;
temp = x;
x = y;
y = temp;
}
void main()
{
string s;
long n, q;
long i, j;
bool k;
cin >> n >> q;
cin >> s;
for (int x = 0; x<q; x++)
{
    cin >> i >> j >> k;
    if (i<1 || j<1 || i>n || j>n)
        break;
    if (k == 1)
    {
        for (int u = i - 1; u < j; u++)
        {
            for (int v = u + 1; v < j; v++)
            {
                if (s[u] > s[v])
                    swapchar(s[u], s[v]);
            }
        }
    }
    else if (k == 0)
        for (int u = i - 1; u < j; u++)
        {
            for (int v = u + 1; v < j; v++)
            {
                if (s[u] < s[v])
                    swapchar(s[u], s[v]);
            }
        }
}
cout << s << endl;
}

然后代码的输出是: -

Time limit exceeded on test 6

当我搜索我发现的测试6时: -

Test: #6, time: 5000 ms., memory: 12 KB, exit code: -1, checker exit code: 0, verdict: TIME_LIMIT_EXCEEDED

输入

2256 44182

kanqevxwgecliptqmdsgnflqyohgtukphlbmjxndbtjqujuafxankfghlseytdwdviamqjscacuyrghriuaihxtyersgnyvigenpflwequgbdusnvlgplxjxkqhjbdvkmufpoirqueufblnnrnbhmcnvewzfdonwjgswuneimtykntwgrlfqlvkdblwjzplhffzqpopbjmvrjcxyzgxqhkjbrgdqnipsipexpoozphfrgzboiiiskawtbhegerhvknrzljclhnpokpazhspsmzeiujddlpfireoyjzriickcuwtbimxjbhunedcdgaabztczkzmahnriarzcmnkjrrfqkodxbpocmxjvutpqbmawcsghwxdidhmwbfxuqegpjtqfvaloycogvoxdtjotlknazaeofaxlomeywwlezlndhpjwbgpxgkvubropxffytucvlbhjugzqgglrezoqsrvwkdrbuehbjxtgobugghqrgbgacqi...

我不知道这个问题是什么意思以及如何解决它 请解释并帮助我。

1 个答案:

答案 0 :(得分:1)

您正在使用具有O(n ^ 2)复杂度的选择排序(具有一些多余的交换),请尝试使用std::sort。您的代码不会有太多变化:

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
string s;
long n, q;
long i, j;
bool k;
cin >> n >> q;
cin >> s;
for (int x = 0; x<q; x++)
{
    cin >> i >> j >> k;
    if (i<1 || j<1 || i>n || j>n)
        break;
    if (k == 1)
    {
        std::sort(s.begin() + i-1,  s.begin() + j);
    }
    else if (k == 0)
        std::sort(s.begin() + i-1, s.begin() + j, std::greater<char>());
}
cout << s << endl;
}

std::sort(s.begin() + i-1, s.begin() + j);s.begin() + i-1开始排序,但不包括s.begin() + j。第二种方法是使用>std::greater)代替<进行相反排序。请注意#include <algorithm>的{​​{1}}和std::sort的{​​{1}}。

请注意,我已经删除了#include <functional>功能,因为我们不再需要它了,我还将std::greater的返回类型更改为swapchar,因为它是&#39;应该是。

上面的代码设法处理测试6你遇到问题但是超过了测试9的时间限制(我甚至尝试过其他一些小的改动)。

要完成9+以上的测试,您可能应该更多地考虑问题和可能的输入,例如以下排序查询:

main

在这里,我们会进行大量无用的排序,如果您确定第9个问题,我将不会感到惊讶。首先,我们按升序对范围[20,57]和[89,950]进行排序,然后我们按降序对范围[57,100]进行排序,然后按升序顺序采用相同的范围,然后完全覆盖第一个范围。最后,我们按降序对范围[1,9500]进行排序,覆盖我们可能完全遗漏的所有先前排序,因为它们反正被覆盖了。

我们可以利用以后排序可以并且可能覆盖以前的知识。我们可以先保存所有&#34;排序查询&#34;我们得到了,后来从最后一个开始(因为那个人无论如何都会覆盖所有以前的那个)并按相反的顺序排序我们尚未排序的范围。通过这种方式,我们可以摆脱许多无用的排序,即使我们以后会覆盖它并加快速度,我们也会这样做。