Skip to content

Commit

Permalink
Update 0-杂项.md
Browse files Browse the repository at this point in the history
  • Loading branch information
a48zhang authored Sep 30, 2024
1 parent 865f78e commit 3965a12
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion 0-杂项.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,15 @@ bash judge.sh a a.cpp
+ 处理强制在线的时候 lastans 负数也要记得矫正
+ 不要觉得编译器什么都能优化
+ 分块一定要特判在同一块中的情况
+ `priority_queue<ll>`是大根堆,每次取出最大。小根堆是`priority_queue<ll,vector<ll>,greater<ll>>`
+ `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

Expand Down Expand Up @@ -261,4 +270,4 @@ i128 sqrti128(i128 n)
}
return lo;
}
```
```

0 comments on commit 3965a12

Please sign in to comment.