常见错误
1.读入过程中直接break,导致数据没读完
一般是根据读入的数据已经判断出无解
如果只有一组数据倒是没所谓,但是多组数据就会出很大问题
2.有些情况不需要更新答案,但是需要更新其他的数据
fo(i,1,ans) {
if (s[i]+x*ans+(ll)(ans-i)*x>t) continue;
z-=(ll)(ans-i+1)*x;
z+=(ll)(ans-i+1)*a[i];
sum=min(sum,z+(ll)k*i);
}
此处如果判断条件不合法就直接continue,没有考虑到虽然不能更新答案,但是z是需要更新的。正确代码如下
fo(i,1,ans) {
z-=(ll)(ans-(ll)i+1ll)*x;
z+=(ll)(ans-(ll)i+1ll)*a[i];
if (s[i]+x*ans+(ll)(ans-i)*x>t) continue;
sum=min(sum,z+k*(ll)i);
}
3.add函数没有考虑到有负数情况
void add(ll &x,ll y){
x=(x+y>=p) ? (x+y-p):(x+y);
}
add函数一般是在取模的时候用到,为了减少%运算带来的常数,但是有的时候又出现负数,如果直接用add,就有可能溢出,所以就要另外写一个sub函数
void sub(int &x,int &y){
x=(x-y<0) ? (x-y+p) : x-y;
}
另外int 运算也会比ll快一些,在计算量较大的情况下在评测机上尤为明显,但在本机上相差不大,这是需要注意的。
4. inf设置不合理
对于int的情况,经常习惯性的
const int inf=1<<30;
但是两个都是inf的时候加起来就爆了