由数据范围反推算法复杂度以及算法内容

一、由数据范围反推算法复杂度以及算法内容

  • 一般 ACM 或者笔试题的时间限制是 1s 或 2s。
  • 在这种情况下,C++ 代码中的操作次数控制在 107∼108 为最佳。
  • 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
  • (1) n ≤ 30 => 指数级别 => dfs + 剪枝,状态压缩 DP。
  • (2) n ≤ 100 => O(n3) => Floyd,DP,高斯消元。
  • (3) n ≤ 1000 => O(n2),O(n2logn) => DP,二分,朴素版 Dijkstra、朴素版 Prim、Bellman-Ford。
  • (4) n ≤ 10000 => O(n∗√n) => 块状链表、分块、莫队。
  • (5) n ≤ 100000 => O(nlogn) => 各种 sort,线段树、树状数组、set / map、heap、拓扑排序、Dijkstra + heap、Prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树。
  • (6) n ≤ 1000000 => O(n),以及常数较小的 O(nlogn) 算法 => 单调队列、 hash、双指针扫描、并查集、KMP、AC自动机;常数比较小的 O(nlogn) 的做法:sort、树状数组、heap、Dijkstra、spfa。
  • (7) n ≤ 10000000 => O(n) => 双指针扫描、KMP、AC 自动机、线性筛素数。
  • (8) n ≤ 109 => O(n√) => 判断质数。
  • (9) n ≤ 1018 => O(logn) => 最大公约数,快速幂,数位 DP。
  • (10) n ≤ 101000 => O((logn)2) => 高精度加减乘除。
  • (11) n ≤ 10100000 => O(logk×loglogk) => k 表示位数,高精度加减、FFT / NTT。

二、数据范围

数据类型数据范围数量级
unsigned int0~42 9496 729542亿 10位
int-21 4748 3648~21 4748 36472*109
unsigned long0~42 9496 729542亿 10位
long (32位系统)-21 4748 3648~21 4748 364721亿
long long的最小值-922 3372 0368 5477 580819位
long long的最大值922 3372 0368 5477 58079 ∗ 1018
unsigned long long0~1844 6744 0737 0955 161520位
float(浮点型)3.402823E-38~3.402823E+3838位
double(浮点型)1.79769313486232E-308 ~1.79769313486232E+308308位
  • long long 内的最大阶乘20!
  • int 内的最大阶乘12!

三、其他知识点

1. long 和 int 的大小跟系统位数有关

系统位数long 和 int 的大小
16位系统long 是 4 字节,int 是 2 字节
32位系统long 是 4 字节,int 是 4 字节
64位系统long 是 8 字节,int 是 4 字节

2. memset 常用赋值

  • 头文件 <cstring>
  • memset(f, 0, sizeof(f));
  • (1) 0
  • (2) -1
  • (3) 0x3f(正无穷 1,061,109,567)
  • (4) -0x3f(负无穷 -1,044,266,559)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚心求知的熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值