一些易错的地方:
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;