c++代码实现总结
卡常
内存
内存访问连续性
不必赘述。
扁平化内存池
把结构体套 vector,转为结构体套 int*,再开一个全局数组作为内存池。
运算
不取模 gcd
参考本文。
数据结构
线段树单点查改
可以开一个数组记录每个下标对应的叶子,然后循环处理。
线段树套离散化
对线段树上父节点的每个数,记录子节点中离散化编号,这样每次访问从二分/哈希表查询变为数组访问 \(\mathcal{O}(1)\)。
zkw 线段树
即非递归线段树。
重要应用:作为“竞赛树”,替代可删堆,时间快于二叉堆,空间优于优先队列。例题。
// 小根堆
int val[N];
struct Heap{
int tr[N<<1];// 最小值位置
bool cmp(int x,int y){
if(val[x]!=val[y]) return val[x]<val[y];
return x<y;
}
void build(int n){
for(int i=1;i<=n;i++) tr[n+i-1]=i;
for(int i=n-1;i>=1;i--){
if(cmp(tr[i<<1],tr[i<<1|1])) tr[i]=tr[i<<1];
else tr[i]=tr[i<<1|1];
}
}
void update(int x){
for(x+=n-1;x>>1;x>>=1){
if(tr[x>>1]==tr[x^1]) break;
if(cmp(tr[x],tr[x^1])) tr[x>>1]=tr[x];
else tr[x>>1]=tr[x^1];
}
}
void erase(int x){
val[x]=infll;
update(x);
}
int top(){
int x=tr[1];
if(val[x]==infll) return -1;
return x;
}
};
编译选项
-Wall -Wextra:报告“所有”Warning。-fsanitize=undefined,address:在运行时检测未定义行为和寻址溢出,叠加-g可以报告错误行号。-Wconversion:在编译期报告程序中类型窄化。注意对头文件内类型窄化无效(例如pair<int,int>{(ll)x,(ll)y})。-Wsystem-headers:显示所有头文件内的Warning,叠加-Wconversion可以检测头文件内类型窄化,可以看xxx: required from here找到代码中错误位置。

浙公网安备 33010602011771号