求大佬帮忙改一下树剖

P3178 [HAOI2015] 树上操作

@[哔哩哔哩干杯](/user/186045) swap中的异或是我从其他大佬哪里学来优化代码的,我程序中const int MAXN=1e5+10;以上的其实都可以删去,不会影响代码正确性,而且我一般做题不开O2,所以无影响
by WJX3078 @ 2020-10-23 19:49:16


@[AuCloud](/user/75954) 请问您问的是哪里的l==r 1.pushdown中,l==r是为了防止数组越界,因为叶子节点是不用下传lazy标志的 2.change中,l==r也是为了防止数组越界,因为叶子节点是不用修改叶子节点以下的权值的 3.ask中,l==r也是为了防止数组越界,之前已经判断过改叶子节点不是要访问的节点,所以也不用访问其儿子节点(本来他也没有儿子节点)
by WJX3078 @ 2020-10-23 19:57:10


@[EternalLightning](/user/173551) 谢谢大佬花时间帮我测试线段树,我可能还要看看其他操作是否有问题,总之谢谢大佬了
by WJX3078 @ 2020-10-23 20:00:14


@[邬健翔307816794](/user/109931) 是这样的,但是在你谷好像对时间优化不大,和用t中转的swap差不多时间。
by itisover @ 2020-10-23 20:00:24


@[哔哩哔哩干杯](/user/186045) 受教了,谢谢大佬指点
by WJX3078 @ 2020-10-23 20:03:11


~~这种东西没人看的别发了~~
by 烛木 @ 2020-10-23 20:20:40


各位大佬们,我修改了一个很神奇的地方,然后就A了
by WJX3078 @ 2020-10-23 21:20:27


这个是原来的写法 ``` while(m--) { int opt=read(); if(opt==1) operate1(read(),read()); if(opt==2) operate2(read(),read()); if(opt==3) printf("%lld\n",operate3(1,read())); } ``` 然后我改为 ``` while(m--) { int opt=read(); if(opt==1) { int x=read(),a=read(); operate1(x,a); } if(opt==2) { int x=read(),a=read(); operate2(x,a); } if(opt==3) { int x=read(); printf("%lld\n",operate3(1,x)); } ``` 就A了,这是为什么,直接把read()读到的值扔到函数里去就会错吗
by WJX3078 @ 2020-10-23 21:23:34


这好像涉及到C++中的函数调用,我发表一些拙见。在C++中调用函数时,参数是从右向左压入栈空间的(__stdcall, __fastcall等协议均是如此),这样的话调用时就会先调用 ```cpp operate1(read(),read()); ``` 里面右面的 $read()$ ,再调用左面的。相当于 ```cpp int x=read(),a=read(); operate1(a, x); ``` 至于函数中多个参数的情况也是如此,从右向左调用。所以说源代码在改之前相当于传入了相反的参数,从而导致 $RE$ 。 另外,题主的 $opt == 3$ 的情况是不需要修改的,因为只调用了一个 $read()$ ,~~虽然会导致马蜂不统一~~
by aytony @ 2020-12-12 15:38:42


@[WJX3078](/user/109931) %%%大佬,请问您是如何做到CSP做题强制不开O2的?%%%
by isitover @ 2021-10-26 10:50:23


上一页 |