手残错误总结

一些易错的地方:

1.空间是很容易算错的,尽管很多题不卡空间。
3kw int = 128MB
2.在组合数取模的时候,阶乘数组可能会开小,因为你不一定看仔细那个组合数的m和n的定义域。
3.多组读入的时候,不要在读入时判解并退出。
4.s.lower_bound(val);(这个是对的)
5.lower_bound(s.begin(),s.end(),val)(这个是 log2 的)
6.写KD树的时候:

int x = ++ n;
Rep0(i,D)u.d[i] = qd[i];//没加mx,mn的值
Rep0(i,D)u.mn[i] = u.mx[i] = u.d[i];
nth_element(t + l,t + x,t + r + 1,cmp);
++ d;
if(d == D)d = 0;

这个显然顺序反掉了……感觉非常有趣自己是怎么写出这么脑残的代码。
7.下标问题……

for(int i = 1;i <= n;++ i)b[++ cnt] = x[i],b[++ cnt] = y[i];
sort(b + 1,b + 1 + cnt);
for(int i = 1;i <= n;++ i)x[i] = lower_bound(b + 1,b + 1 + n,x[i]);

lower_bound的下标挂掉了。
8.在使用CDQ分治的时候:
1)每层的数据(结构)不清空,导致影响下一层。
2)一个先算两边再算中间贡献的东西,不用归并排序合并导致多个log。
3)手残把mid之后的也塞到结算贡献里面去。
9.比赛后十五分钟检查:
1)数组大小和数据范围是否匹配
2)文件
10.手写bitset很重要。
不要做过多的用stl卡常数的想法,毕竟有一个笑话叫做不开O2的stl。
在做count的时候分治思想开成弄成两半就好了。

a[i] = 1 <=> a[i >> 5] |= 1u << (i & 31);
a[i] = 0 <=> a[i >> 5] &= (~1u << (i & 31));
a.count() <=> for(int i = 0;i <= SIZE / 32;++ i)cur += cnt[a[i >> 16]] + cnt[a[i] & 65535];

11.

int h = 1,t = 1;Rep0(c,26)if(v)q[++ t] = v;
while(h < t){int x = q[h ++];...}

h++ 显然是对应的 h<=t 啊。。。

12.数组要多开几位。理由是:
char 数组要多读一个’\0’,会占用一个字符,导致莫名其妙的WA/TLE/RE.
+3就挺好的,+5在卡空间的题目上可能会MLE.
NOIP2016-toy这个题不知道数组开小送了多少人退役

13.数组下标在减一的时候要判断是否合法。
TC SRM 671 Div1 300

14.KD树的构建时,代码要写好看一点。

int Build(int l,int r,int d)
{
    int x = l + r >> 1;
    cmpd = d;
    nth_element(t + l,t + x,t + r + 1,cmp);
    rep(i,0,1)u.mn[i] = u.mx[i] = u.d[i];
    Rank[u.id] = x;
    if(l != x)u.lc = Build(l,x - 1,!d);
    if(x != r)u.rc = Build(x + 1,r,!d);
    return Upd(x),x;
}

这样就勉强能凑合着看,不要来回改 cmpd ,要每次把它进行赋值,否则的话复杂度是错的,就在写Kangaroo那个题的时候T飞掉了。
15.CostFlow
spfa费用流:

int head[N],dis[N],q[N];

不会写SPFA的智障都去死吧TATATATATATATAT(没错我数组就是开小了)

16.cmp

LL a[N],b[N];
bool cmp(int a,int b){return a > b;}

嗯……好吧QAQ
17.ADD
养成一个好习惯,叫做把取模的加法什么的都写成函数。
嗯?

void Add(int x,int y){x += y;if(x >= mod)x -= mod;}

18.位运算的时候注意开longlong。
所以这就是……这就是我数组不开longlong的理由?

int a[N][N];
Rep(i,n)a[1][i] = 1ll << i;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值