1、在一个地图求最大面积的类问题中,要注意障碍结点的影响。
2、ll(),表示的是在运算后把括号内强制转化为类型ll,而(ll)表示后面的每个玩意都强制转化为类型ll。在做历史研究这道题时我WA就是因为我用的是ll()而不是(ll)。
3、莫队算法初始时应该是l=r=1(不能设为0)
4、splay每次splay操作后一定要记得更新root!
5、可以使用树状数组就尽量不要使用线段树。在Gty的文艺妹子序列这道题本机测试极限数据,线段树15s而树状数组4s,差距真大。
6、不需要开long long的就不要开long long。
7、分块算法,一定要特判两个端点之间没有跨过任意整一块的情况。
8、建广义SAM时,如果采用离线做法,为了递推size而进行的排序还要以编号为第二关键字(第二关键字按照从大到小)。
9、使用问号语句记得括号,不然会出错例如:
(ll)dp[i-1]*i%mo+(i%2)?-1:1
得到的值只有-1或1。
正确打法:
(ll)dp[i-1]*i%mo+((i%2)?-1:1)
1、不要主观臆断认为一个算法会TLE。
1、整体二分及cdq分治实现时,每个区间不需要单独开队列。可以把操作弄到一个数组了,然后多两个参u、v表示这个区间的操作在u~v,做完后对每个操作打标记表示是否往右区间传即可。
2、两个long long相乘取模怎么办?
第一种是快速乘,类似快速幂,复杂度多了个log
第二种是找一个比较小的数,然后搞一波,详见代码
ll qsc(ll x,ll y){
ll a1=x/1000000,a2=x%1000000,b1=y/1000000,b2=y%1000000;
ll t=a1*b1%p*1000000%p*1000000%p;
t=(t+a2*b2%p);
t=(t+a1*b2%p*1000000%p);
t=(t+a2*b1%p*1000000%p);
return t%p;
}
第三种来自Yves___的博客long long相乘取模黑科技
LL mult( LL A, LL B, LL Mo )
{
LL temp = ( ( LL ) ( ( db ) A*B/Mo+1e-6 ) * Mo );
return A*B - temp;
}
大概意思就是强制转double然后搞一波再转回来。
3、unique()可以删除重复元素,然后返回删除重复元素后的末端地址。
下面这段代码即可实现离散化。
fo(i,1,n) scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+n+1);
l=unique(b+1,b+n+1)-b-1;
fo(i,1,n) a[i]=lower_bound(b+1,b+l+1,a[i])-b;
4、可以用调用ctime,运用clock()获取程序运行至该语句时的时间(默认ms)
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
int n=0;
//start=clock();
while(n<100000000)
n++;
cout<<(double)clock()<<endl;
return 0;
}
5、调用头文件bits/stdc++.h就相当于包括了好多库……
6、如何打伪随机数?
int rand() {
static int rand_seed=1542071823;
rand_seed+=rand_seed<<1|1;
return rand_seed;
}
7、对拍(从前一直用c++对拍的蒟蒻就是我)
在程序的目录下建立.txt文件,输入:
@echo off
:loop
data.exe //生成数据
right.exe //要对拍的
brute_force.exe //暴力
fc data1.out data2.out //两个程序的输出文件
if not errorlevel 1 goto loop
pause
goto loop
把文件扩展名名改成.bat
8、关于可持久化,记住以下几点:
1:一个点的信息要被修改时需要对其新建。
为了节省空间,一个点的信息不被修改时就没必要新建了。
例如合并一个结点与空节点,此时不需要新建。
2:为了节省空间,如果对空节点进行newnode我们直接返回空节点。
3:打标记也涉及修改信息,不要忘记newnode。而down的时候其实并不用,因为修改的是儿子的信息。
9、从OJ上看来一句话,不知道来源。
OI比赛的题目无非三种,从暴力到优化,从一般到特殊,重新定义题目。
10、 FFT/NTT做题方法与调试技巧(+提高码题效率的一些想法)
来自链接