From 3965a127f2a97576bf23d9af16513f490baab774 Mon Sep 17 00:00:00 2001 From: hazardous waste <107384053+a48zhang@users.noreply.github.com> Date: Mon, 30 Sep 2024 21:41:41 +0800 Subject: [PATCH] =?UTF-8?q?Update=200-=E6=9D=82=E9=A1=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "0-\346\235\202\351\241\271.md" | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git "a/0-\346\235\202\351\241\271.md" "b/0-\346\235\202\351\241\271.md" index 5d30b6b..f07ef4d 100644 --- "a/0-\346\235\202\351\241\271.md" +++ "b/0-\346\235\202\351\241\271.md" @@ -104,6 +104,15 @@ bash judge.sh a a.cpp + 处理强制在线的时候 lastans 负数也要记得矫正 + 不要觉得编译器什么都能优化 + 分块一定要特判在同一块中的情况 ++ `priority_queue`是大根堆,每次取出最大。小根堆是`priority_queue,greater>` ++ `char`是有符号数,范围为-128~+127,'a'=97,'z'=122。所以小心溢出。 ++ 结果取模的题目,不要用除法!不要用除法!不要用除法!而是去算逆元。比如$n\leq 10^9$这种,然后要算前$n$个数的平方和,即$1^2+2^2+...+n^2$这种,当然知道答案是$\frac{n(n+1)(2n+1)}{6}$,但是不要想着去除以6。一方面,如果先算三个数的乘积,爆long long是很正常但是我们又不想看见的结局;另一方面,你也许猜到了可以$n(n+1)/2*(2n+1)/3$,这可以保证每次必然是整除的。但为了防止爆long long,我们依然会除一次就mod一次,但是,在进行模运算后,原来是3的倍数这一性质就被抹除了,导致答案错误。所以,去算$n*(n+1)*(2n+1)*inv(6)$,然后记得乘一次就模一次。 ++ 对于区间处理(比如最长/最短相同序列)(e.x. 1 1 2 1 1 1最长相同的长度是3)你在维护cnt的时候,最后那个1 1 1那一块会没有更新到(只更新了cnt但没有更新ans),在循环外要再多手动更新一次。 ++ 写while语句时,记得边界检查(&&p<=n这种)(我觉得是for循环写多了导致写while老是忘边界) ++ 如此看来,还是应当在程序执行之前就做好归零/清空的准备。因为当你写出稀奇古怪的返回时刻的时候,可能你的急于return导致了有些时候,归零/清空/善后并没有做好。然后导致问题出错。 ++ 取模的题记得每行的末尾都加mod,每次乘完也加mod。 ++ 为结构体排序,为第一维排好序后,还是要考虑当第一维相同时,第二维的有序情况。 ++ 出现爆long long的情况却又分析不出原因时,考虑是不是哪里指数爆炸了。 ## sol.cpp @@ -261,4 +270,4 @@ i128 sqrti128(i128 n) } return lo; } -``` \ No newline at end of file +```