275 words
1 minute
Linear_Algebra
线性代数部分
线性基
其中表示基的大小
插入操作
从高位到最低位贪心即可
bool insert(int x){ for (int i=30;i>=0;i--){ if (x>>i&1){ if (!val[i]){ val[i]=x;cnt++; return 1; } x^=val[i]; } } return 0;}求第k小
将二进制拆分,按位取就可以(的情况需要特判,这里只是计算目前基的第小)
int qry_kth(int k){ int ans=0,ct=1<<cnt; for (int i=30;i>=0;i--){ if (val[i]){ if (k>(ct>>=1)){ k-=ct; if (~ans>>i&1)ans^=val[i]; } else if (ans>>i&1)ans^=val[i]; } } return ans;}求x的排名
这里我们计算小于等于的数的个数,首先需要记录一个异或和,就是所选的的异或和。 从大到小枚举每一位,我们知道,有值的地方的一定能取到,我们可以维护使得取到这些位置上的,对于的位置,如果与不同时,说明我们知道所求位置了,判断一下是谁有就可以了。
int qry_rk(int x){ int ans=0,ct=(1<<cnt),pre=0;x++; for (int i=30;i>=0;i--){ if (val[i]){ ans+=(x>>i&1)*(ct>>=1); if ((x^pre)>>i&1)pre^=val[i]; } else if ((x^pre)>>i&1){ if (x>>i&1)ans+=ct; break; } } return ans;} Linear_Algebra
https://fuwari.vercel.app/posts/linear_algebra/