精确编码的零零碎碎注意点
目录
检查变量是否有误!检查变量!检查变量!检查变量!
只记一些因细小问题而导致长时间调试的问题。
可预见本文一字一句都是痛苦罚坐的缩影QAQ。
语法错误
数组范围
1. 数组范围是否改大
2. 双向建边时N是否×2
3. 题目中出现偶数长序列等,是给定数据的n倍,数组记得乘n。
重构代码的维护范围问题
1. 单条语句改多条时要加大括号
if(j==mi[i].size()) found=true;
// cout<<cnt<<endl;
ans=max(cnt,ans);
/*--------------------------*/
if(j==mi[i].size()) {
found=true;
ans=max(cnt,ans);
}
2. 注意if维护的范围。(对拍出来的错误,太草了)
if(cnt>=maxcnt) {
maxcnt=cnt;
val=arr[i-1];
cnt=1;
}
/*cnt=1;*/
数据范围问题
1. 常数默认为int! 当n>31时1<<n会出现问题!1LL<<n。
ll l=1,r=(1/*LL*/<<n)-1;
2. popcountll等小问题
3. 精度问题:将浮点数转换为整数除去小数位时,使用(ll)(double+eps)。
初始化问题
4. STL报错,检查STL初始化和越界问题
/*ans=a*/
for(ll i=0;i<b.length();++i) {
for(ll j=a.length()-1; j>i; --j) {
t=ans;
swap(t[i],t[j]);
sort(t.begin()+i+1,t.end());
if(t.compare(b)>0)
ans=t;
else break;
}
}
cout<<ans<<endl;
逻辑错误
循环问题
检查步骤:
1. 循环变量、循环范围、循环条件
2. 循环之前的初始化,第1步还是第0步还是while到区间左端。
3. 循环之后的处理,第n-1步还是第n步还是第n+1步,开还是闭,区间收尾等。
问题:
1. 多重循环记得写上外重循环的条件
2. while别忘了增加加循环变量
//匹配字符串时
ll p=0;
ll cnt=0;
ll j;
for(j=0; j<mi[i].size(); j++) {
while(p<nshu.size()&&nshu[p]!=mi[i][j]) ++p;
if(p==nshu.size()) break;
++cnt;
/*++p;*/
}
其他
1. goto只用来输出答案,其他情况别用!切记!
2. 比较运算符的优先级竟然比位运算大!
算术运算>位移运算>比较运算>位运算>逻辑运算
(n&(1<<i))>0&&(m&(1<<i))==0
/*而不是n&(1<<i)>0&&m&(1<<i)==0*/
((l+r)>>1)+1
/*而不是(l+r)>>1+1*/
数据结构
线段树
1. 若异常退出,调试发现rt超限,请检查是否加上return语句。
2. 若无算法问题,检查输入区间是否相反。