1、lca预处理dfs中,1~20顺序枚举,而非倒序。


void dfs(int x,int fa){/** f,dep */ f[0][x]=fa;d[x]=d[fa]+1; for(int i=18;i>=0;--i)f[i][x]=f[i-1][f[i-1][x]]; qxs(){dfs(v,x);} }


void dfs(int x,int fa){/** f,dep */ f[0][x]=fa;d[x]=d[fa]+1; F(i,1,18)f[i][x]=f[i-1][f[i-1][x]]; qxs(){dfs(v,x);} }
2、线段树忘记下传懒标记
3、三目运算符优先级很低,?,:左右要加括号。下面代码中不加括号的话0和ask会连起来,作为上一个“:”后面的语句。


(l<=z?ask(x<<1,l,r):0)+(r>z?ask(x<<1|1,l,r):0);
4、判断了节点在子树内部,在字数外面,还要判断是他自己。
5、取模优化错了。有一个地方有减法,忘了+mod,出负数了。有减法的地方一定要+mod
5、主席树ask:if(l==r)return 1
正确:return sz[]
6、数组开小。枚举全部区间是n^2的,开了n的。
7、memset 、memcpy :不写sizeof,直接写长度,要注意字节长度。
一是bool,char是一个字节,二是define int LL 后,注意4字节变8字节。
没有必要,尽量不要用。
8、1e6个1e15相加,爆LL
9、原:


for(int i=1,j=1;i<=top&&a[i]<=n;++i){ if(a[i]!=a[i+1]){ ++ans[j];--ans[0]; j=1; } else ++j; }
现:


for(int i=1,j=1;i<=top&&sta[i]<=n;++i){ if(sta[i]!=sta[i+1]){ ++ans[j];--ans[0]; j=1; } else ++j; }
数组名打错了。改了6个字多了80分。考试三小时改题5分钟。我真是改题大神。
10、ans没有清空为0。相当于多测了。


while(m--){ int lmt=read();ans=0; dfs(1,0,lmt);printf("%d\n",ans); }