忠告后人(特别针对只过了#11或者没过样例)

P2572 [SCOI2010] 序列操作

xs_siqi @ 2022-08-02 23:34:25

这题调了将近 5h ,交了三十几次才过。把我调试这道题代码的经验分享给后人。

  • 查验函数(特别是pushuppushdown)顺序。有的时候顺序是不能乱换的,前后顺序会影响赋值。很有可能出现思路正确顺序错误的情况。我原本写了两个pushdown,发现revamp的两次pushdown是必须同时进行的。

  • 查验左儿子和右儿子是否对齐。就这点调了 3h。我原本的部分revamp代码如下:

        swap(tr[rt<<1].lmax0,tr[rt<<1|1].lmax1);
        swap(tr[rt<<1].rmax0,tr[rt<<1|1].rmax1);
        swap(tr[rt<<1].sum0,tr[rt<<1|1].sum1);

左儿子和右儿子换显然是不合理的吧?但这代码竟然能过样例,甚至还过了一个数据点。如果您只过了#11,请一定要好好校对左儿子右儿子是否对齐。

  • 左右标记要 ++。就这点我程序一直运行时错误。调了将近 1h,重审题面才发现要++!没过样例的一定要好好看看是否有++。

  • 数组开大。起码开 4 倍。常识。但还是容易错。

如果以上做法都没有解决,不排除是代码思路问题的可能。

调了 5h 终于过了555


by _JF_ @ 2022-08-03 07:52:56

%%%


by P32sx @ 2022-10-17 16:21:49

写i系欸i谢谢、、下、下、下、fix彻底发文、fiawdiasidasid


by P32sx @ 2022-10-17 16:22:10

谢谢惺惺惜惺惺谢谢xxxxxxxxxxxx


by P32sx @ 2022-10-17 16:24:54

谢谢大佬,现在十分激动,改了可能也有将近 5h ,原因是

左儿子和右儿子换显然是不合理的吧?但这代码竟然能过样例,甚至还过了一个数据点。如果您只过了#11,请一定要好好校对左儿子右儿子是否对齐。

by _Minmatar_Star @ 2023-10-16 20:40:21

只过了样例的hack的注意读题,op4求得是连续的1,不能算连续的0


|