首页 > 编程语言 >常见算法和数据结构存在的坑(updating)

常见算法和数据结构存在的坑(updating)

时间:2023-05-09 18:31:40浏览次数:50  
标签:int 线段 splay 多组 算法 数组 清空 数据结构 updating

数组:

c++数组下标都+5会稳。
\(5000*5000\)的别开\(6000*6000\)。

二分:

实数二分可能因为神马精度问题出现了不满足二分序的情况,要小心。

注意二分完后,不能直接用当前数组里存的值,要pd(ans),值才是正确的。

边集数组:

无向图边的范围要开2倍。

多组数据要清空的有tot,final

当用到反向边的时候,tot初值为1(一定要记得赋值)。

分解质因数:

for(int i = 1; i <= p0 && (ll) p[i] * p[i] <= n; i ++) if(n % p[i] == 0) {

注意只预筛\(\sqrt n\)以内的质数时,一定要加上i<=p0,因为n是\((p[p0]^2,maxn]\)内的一个大质数时,就会循环到外面去。
或者多筛一点,比如说\(\sqrt n + 100\)

随机:

rand()的取值是\([0,RAND\_MAX]\)
windows下,\(RAND\_MAX = 2^{16}-1\)
Linux下,\(RAND\_MAX = 2^{32}-1\)

random_shuffle有点假,当随机性要求高时建议自己随机交换:

i = 1 -> n
    swap(a[i], a[rand(i, n)])
//理论上面的这个比下面的优
i = 1 -> n
    swap(a[i],a[rand(1, n)])
//std ::random_shuffle是下面这么写的
i = 1 -> n
    swap(a[i], a[rand(1, i)])

set:

不要把multiset写成set了。

且multiset重载<时需要注意不能只重载了值,其余的附带信息最好也加进后续的关键字,不然在erase就会出锅。

线段树:

普通线段树:

如果下标有负数的话一定要用位运算,不然会GG。

int m = x + y >> 1;

x,y为int里面的整数,但是(x+y)可能爆int。

不下传标记线段树:

矩形覆盖问题只能用不下传标记线段树,千万不要卡死在普通线段树上。
而且不下传标记线段树局限性很大。

treap:

随机手写会快,但不要伪了
要维护fa时,可以在upd时更新,但是在split和merge开头,需要:

fa[son[x][0]]=fa[son[x][1]]=0

因为中间过程中可能把一个点的儿子设空,而这个儿子又没有新的父亲,就更新不到了

网络流:

网络流多组数据清空的有:
边集数组,co,d,cur,其实就是全部要清空。

上下界网络流:

最小流的时候,\(S\)和\(T\)互换,一般清空\(1 \sim T\)的点,就会清不到\(S\),就错了。

所以要\(1 \sim max(S,T)\)

第一步的真实流量不是\(SS->TT\)的流量,而是\(T->S\)那条\(\infty\)的边的流量。

字符串:

exkmp:

自我匹配时要预处理next[2]。

manacher:

若r包括当前这个点,实际最长回文子串长度等于max(r)-1。

SA:

如果有多组数据,则height那里要加一句话,因为字符串的后面可能出事。

原代码:

int j, k = 0;
    for(int i = 1; i <= n; Height[rank[i ++]] = k) 
        for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k]; ++ k);

现代码:

int j, k = 0;
    for(int i = 1; i <= n; Height[rank[i ++]] = k) 
        for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k] && (i + k <= n) && (j + k <= n); ++ k);

更新:
另一种写法,把s[0]和s[n+1]赋inf即可

ps.:
SA还有一个坑,在多组数据时会挂:

int cmp(int *f, int x, int y, int z) { return f[x] == f[y] && f[x + z] == f[y + z];}

观察这一句话,是存在越界风险的:
当f[x]=f[y]时会执行后面那句话,那么x+w-1、y+w-1都必须<=n,f[x]才可能=f[y]
假设x+w-1=n,则f[x]==f[y]依然可能,此时f[x+w]就越界。
一般来说数组都会开大几位,如果默认是0,则没有问题。
但是多组数据中不是默认为0的,所以要清空后一位。

AC自动机:

标记一定要沿fail链传一下。

SAM:

广义要宽搜。
如果深搜建广义,就会有空点,然后一些性质就炸了。

高斯消元:

实数的话要预先把系数归一,详情见板。

splay:

在splay里比如说找中序遍历第k个点,找完之后一定要把那个点splay一下,不然可能会跑得极慢。

lct:

access(x)以后x不是所在splay的根,为了方便可以改一下access的写法,最后加一个splay。

cut时,pf[x]也要清空。

link时,最好把x,y都makeroot了,不然在奇妙的子树维护下可能会出锅。

FFT:

FFT做的其实是一个循环卷积。
如果\(A*B=C\),其实式子是这样的:
\(\sum_{i=0}^n \sum_{j=0}^nC_{(i+j)~mod~n}+=A_i*B_j\)

这就是为什么要取>=n的最小的2的幂*2的原因。

所以如果有多次FFT,每次做完一定要清空下标大于等于n的。

注意这里说的n是次数界,如果下标最大是n,次数界是n+1。

还有如果是一个小mo数,就是一定要算好每次数的范围,如果太大就不能NTT(除非取多个模数),就要用long double去FFT。

拉格朗日插值自然数幂和:

其实拉格朗日插值不背这个锅。

只是一个n次的多项式一定要n+1点才能确定位置。

而幂次是n的自然数幂和是一个n+1次的多项式,所以要插n+2个值。

一般插0-n+1。

凸包:

起点设为最上最左的可以使建完的凸包的向量的几角(atan2(y,x))递增。


标签:int,线段,splay,多组,算法,数组,清空,数据结构,updating
From: https://blog.51cto.com/u_16105286/6259847

相关文章

  • AI智慧安监:打电话/玩手机智能检测算法的场景应用
    1、方案背景 在油库、加油站、化工厂等场景中,安全生产是首要的监管问题,因为有易燃物品的存放,打电话很容易引起火灾爆炸等安全事故,造成巨大的生命和财产损失。因此,对人员行为的监管是安全的关键,在一些特定场合需要禁止人员打电话。传统的监管方式容易造成疏漏,利用AI智能识别技术......
  • 数据结构实训_银行管理系统
    记录下自己寒假写的千行代码,虽然千行,但是质量不高,但是好歹自己写的,记录下嘿嘿#include<bits/stdc++.h>usingnamespacestd;constintINF=0x3f3f3f3f;//----------------------------------------顾客信息-----------------------------------------structnode{in......
  • 【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现|附代码数据
    原文链接:http://tecdat.cn/?p=22945最近我们被客户要求撰写关于动态时间规整算法的研究报告,包括一些图形和统计输出动态时间扭曲算法何时、如何以及为什么可以有力地取代常见的欧几里得距离,以更好地对时间序列数据进行分类时间序列分类的动态时间扭曲使用机器学习算法对时间序......
  • 学习JavaScript数据结构与算法 第五章
    五,队列和双端队列我们已经学习了栈。队列和栈非常类似,但是使用了与后进先出不同的原则。双端队列是一种将栈的原则和队列的原则混合在一起的数据结构。5.1队列数据结构队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最......
  • 排序算法
    1.插入排序voidinsert_sort(){for(inti=1;i<n;i++){intx=a[i];intj=i-1;while(j>=0&&x<a[j]){a[j+1]=a[j];j--;}a[j+1]=x;}......
  • 算法基础上机实验——2023年5月8日
    01背包问题#include<iostream>usingnamespacestd;constintN=1010;intn,m;intv[N],w[N];intf[N];intmain(){cin>>n>>m;for(inti=1;i<=n;i++)cin>>v[i]>>w[i];for(inti=1;i<=......
  • 机器学习算法原理——逻辑斯谛回归
    文章目录逻辑斯谛回归二项逻辑斯谛回归模型极大似然估计多项逻辑斯谛回归模型总结归纳逻辑斯谛回归写在前面:逻辑斯谛回归最初是数学家Verhulst用来研究人口增长是所发现的,是一个非常有趣的发现过程,b站有更详细的背景及过程推导,在此不再赘述:https://www.bilibili.com/video/BV1N......
  • 电动汽车用内置式永磁同步电机基于查询表 的矢量控制算法, 自动生成?
    电动汽车用内置式永磁同步电机基于查询表的矢量控制算法,自动生成满足MTPA(最大转矩电流比/MTPV(最大转矩电压比)的dq轴电流参考值查询表。程序使用m脚本文件编写,将生成的查询表以C语言二维数组的形式输入到txt文本文件中,可直接复制到应用程序中,避免工程师对数据进行二次提......
  • 采用simulink仿真嵌入C语言实现了逆变器的搭建,整个仿真没有一个模块,所有算法均用C语言
    采用simulink仿真嵌入C语言实现了逆变器的搭建,整个仿真没有一个模块,所有算法均用C语言实现,并对C语言代码给出了详尽的注释。逆变器输出的电压THD仅有0.4%。可以根据这个例子写自己的算法,并把在simulink中写的代码直接移植到DSP或者别的控制器中的中断中,不需要做任何修改。ID:55200......
  • 在服务器中提交lammps计算时,用多少个核计算,才会使得自己和别人的运算会更快?是不是提交
    (摘自以下内容)下边我们做几组测试,并对比计算速度:(采用同一个模型,所含原子数:19144(算挺得多了))4个核——未超负荷运行100%情况下——1天能跑0.488ns=488ps26个核——超负荷10个核运行——1天能跑0.023ns=23ps56个核——超负荷40个核运行——1天能跑0.018ns=18ps126个核—......