数据有误
查看原帖
数据有误
82152
Tiphereth_A楼主2023/12/20 22:29

简单测了一下,发现数据中的 ff 可能有问题,过程如下:

  1. 搓一个 validator:

    #include <algorithm>
    #include <cctype>
    #include <charconv>
    #include <iostream>
    using namespace std;
    void validate_and_init(int& a, int& b, char& c, int& f) {
      string s;
      getline(cin, s);
      const char* ptr = s.data();
    
      {  // a
        auto [ptr2, ec]{from_chars(ptr, ptr + 3, a)};
        if (ec != std::errc()) exit(__LINE__);
        if (3 > a || a > 100) exit(__LINE__);
        ptr = ptr2;
      }
    
      if (*ptr++ != ' ') exit(__LINE__);
    
      {  // b
        auto [ptr2, ec]{from_chars(ptr, ptr + 3, b)};
        if (ec != std::errc()) exit(__LINE__);
        if (5 > b || b > 100) exit(__LINE__);
        ptr = ptr2;
      }
    
      if (*ptr++ != ' ') exit(__LINE__);
      if (!isgraph(c = *ptr++)) exit(__LINE__);
      if (*ptr++ != ' ') exit(__LINE__);
    
      {  // f
        auto [ptr2, ec]{from_chars(ptr, ptr + min(3, int((ptrdiff_t)s.size() - (ptr - s.data()))), f)};
        if (ec != std::errc()) exit(__LINE__);
        if (0 > f || f > 100) exit(__LINE__);
        ptr = ptr2;
        if ((ptr - s.data()) != (ptrdiff_t)s.size()) exit(__LINE__);
      }
    }
    int main() {
      int a, b, f;
      char c;
      validate_and_init(a, b, c, f);
      int i, j;
      for (i = 1; i <= a; ++i, putchar('\n'))
        for (j = 1; j <= b; ++j)
          putchar((i != 1 && i != a && j != 1 && j != b && !f) ? ' ' : c);
    }
    

    结果见 https://www.luogu.com.cn/record/140364995,可以发现 RE 的数据点均是在第 33 行出的问题,说明 ff 有问题。

  2. 看一下错误码:

    #include <algorithm>
    #include <cctype>
    #include <charconv>
    #include <iostream>
    using namespace std;
    void validate_and_init(int& a, int& b, char& c, int& f) {
      string s;
      getline(cin, s);
      const char* ptr = s.data();
    
      {  // a
        auto [ptr2, ec]{from_chars(ptr, ptr + 3, a)};
        if (ec != std::errc()) exit(__LINE__);
        if (3 > a || a > 100) exit(__LINE__);
        ptr = ptr2;
      }
    
      if (*ptr++ != ' ') exit(__LINE__);
    
      {  // b
        auto [ptr2, ec]{from_chars(ptr, ptr + 3, b)};
        if (ec != std::errc()) exit(__LINE__);
        if (5 > b || b > 100) exit(__LINE__);
        ptr = ptr2;
      }
    
      if (*ptr++ != ' ') exit(__LINE__);
      if (!isgraph(c = *ptr++)) exit(__LINE__);
      if (*ptr++ != ' ') exit(__LINE__);
    
      {  // f
        auto [ptr2, ec]{from_chars(ptr, ptr + min(3, int((ptrdiff_t)s.size() - (ptr - s.data()))), f)};
        if (ec != std::errc()) exit(int(ec));
        if (0 > f || f > 100) exit(__LINE__);
        ptr = ptr2;
        if ((ptr - s.data()) != (ptrdiff_t)s.size()) exit(__LINE__);
      }
    }
    int main() {
      int a, b, f;
      char c;
      validate_and_init(a, b, c, f);
      int i, j;
      for (i = 1; i <= a; ++i, putchar('\n'))
        for (j = 1; j <= b; ++j)
          putchar((i != 1 && i != a && j != 1 && j != b && !f) ? ' ' : c);
    }
    

    结果见 https://www.luogu.com.cn/record/140365169,查表可知错误码是 std::errc::invalid_argument,说明 RE 的数据点对应的 ff 不是整数。

另外关于 https://www.luogu.com.cn/discuss/748831 中提到的三种改正方法,不难发现使用 1,3 时 ff 的值为 00,而第二种方法在 GCC < 13 时可行,因为 GCC < 13 时 include iostream 会进行默认初始化(https://godbolt.org/z/Ys5bP7xdz),而 GCC >= 13 则不会(https://godbolt.org/z/j8Env3Pbh)。

综上所述,我认为该题目的数据有误。

2023/12/20 22:29
加载中...