省选前复习小记
作者:互联网
还有三天复习,而这只蒟蒻还在不知死活的颓废
数据结构小记
\(KD\)-\(Tree\)
- 基础功能:
- 领域查询(类似于启发式搜索,时间复杂度实际上没有保证)
- 维护高维空间数点,(此处以\(2\)维为例),可以进行,矩阵/单点修改,矩阵/单点查询....(反正就是一颗平衡树)
- 不是\(leafy\ tree\),每个点都代表实际上的一个节点和一个子空间,树高为\(O(\log n)\)
- 建树的时候根据\(x\),\(y\)的方差哪个大,决定按哪一维排序,并且尽可能地选择中位数作为根,使得子树尽可能均匀来保证树高
- 如果要求支持动态插入\删除的话,采用替罪羊树的暴力重构法,设一个阈值\(\alpha\)
if(max(siz[lc[u]],siz[rc[u]])) >= alpha * siz[u]
then rebuild(u)
- \(\alpha\)可以取值\(0.725\)
- 练习:[国家集训队]JZPFAR(\(\checkmark\))
- 本来是玄学复杂度的估价函数,然后因为保证数据随机就对了(大雾)
- 最小值的估价函数
double F(int a,int b){/*a到b区域欧式距离的估价*/
double res = 0;
if(t[a].x < L[b]) res += (L[b] - t[a].x) * (L[b] - t[a].x);
if(t[a].x > R[b]) res += (R[b] - t[a].x) * (R[b] - t[a].x);
if(t[a].y < D[b]) res += (D[b] - t[a].y) * (D[b] - t[a].y);
if(t[a].y > U[b]) res += (U[b] - t[a].y) * (U[b] - t[a].y);
return res;
}
- 最大值的估价函数
ll f(int a,int b){
ll ret = 0;
ret += max(s(t[a].x - L[b]),s(t[a].x - R[b]));
ret += max(s(t[a].y - D[b]),s(t[a].y - U[b]));
return ret;
}
- 需要注意一点,\(KD\)-\(Tree\)在建树后的点的下标会改变,如果需要用到原来的下标,需要提前标记
\(splay,LCT\)
\(kruskal\)重构树,笛卡尔树,可并堆
线段树分治,整体二分,树套树,\(cdq\)分治
线性基,\(bitset\)
- 线性基基础操作就不说了
- 静态区间线性基
- 维护前缀线性基,然后同时维护一个时间,在插入的时候尽可能使时间最大即可,具体地,在遍历到某一位时,我们保留时间较大的那一个,并把时间小的往下传
- \(k\)小值
- 如果要求\(k\)小值,我们可以让线性基的每一位互不影响,具体表现为,如果第\(i\)位线性基有值,那么我们就将其他第\(i\)位线性基上有值的数异或掉这一位,只要从大到小操作即可
void rebuild(){
for (int i=60;i>=0;i--)
for (int j=i-1;j>=0;j--)
if (d[i]&(1LL<<j))
d[i]^=d[j];
for (int i=0;i<=60;i++)
if (d[i])
p[cnt++]=d[i];
}
long long kthquery(long long k){
int ret=0;
if (k>=(1LL<<cnt))
return -1;
for (int i=60;i>=0;i--)
if (k&(1LL<<i))
ret^=p[i];
return ret;
}
- 习题:CF1299D Around the World
- \(bitset\)
可持久化数据结构
线段树进阶操作
贪心\(dp\)小记
计算几何学习
网络流/二分图
字符串
数论
组合数学
标签:复习,int,res,ret,省选前,--,估价,线性,小记 来源: https://www.cnblogs.com/y-dove/p/14621248.html