笔记 暴力&搜索
(2023.10.10 第一次发布于洛谷博客)
实战分析
前置芝士:时空复杂度与数据范围
| 理论时间复杂度 | 数据范围 |
|---|---|
| \(O(n)\) | \(n\le 1\times 10^7\) |
| \(O(n\log n)\) | \(n\le 1\times 10^6\) |
| \(O(n^2)\) | \(5000\sim 6000\) |
| \(O(n^3)\) | \(300\sim 400\) |
| 空间限制 | 数组大小(int) |
|---|---|
| \(512MB\) | \(1\times 10^8\) |
| \(256MB\) | \(5\times 10^7\) |
例题
若 \(a>b\),则有 \((b\mod a)>(a\mod b)\),那么取模后得到的最大值显然为 \(a_{n-1}\mod a_n\)。(假定已经排序)
次大值?
假设 \(a,b,c\) 降序排序,则次大值有以下两种可能:
\((c\mod b)=(c\mod a)=c\)
\(\max(a\mod b)=b-1\)
取 \(\max\) 即可。
边权均为 \(1\),可以 BFS 求最短路。
跑出以 \(1,s1,s2\) 为源点的单源最短路,并设 \(u\rightarrow v\) 为 \(u\) 到 \(v\) 的距离。
此时显然两条可能的最短路径各是一条链,前半段可以重复也可以不重复。
枚举两条链的分离点 \(x\),求 \(\sum_{x=1}^n\min((x\rightarrow 1)+(x\rightarrow s1)+(x\rightarrow s2))\)
......然后就 A 了?
但考虑如何骗部分分。
-
\(n,m\le 15\) 枚举每一条边取不取即可。具体实现可以按二进制枚举。
-
\(s1=s2\) BFS 一遍求最短路即可。
-
\(m=n-1\) 图是一棵树,先从 \(1\) 点跑 BFS,并存储 \(1\) 到 \(s1,s2\) 的最短路径,然后计算路径上共有多少条边。
void get(int x){ //找到从x到1的最短路径并标记
int len=dist[x];
while(len){
int tmp=0;
for(auto v:e[x])
if(dis[v]==dis[x]-1) tmp=v;
len--;
vis[tmp][x]=vis[x][tmp]=1;
x=tmp;
}
return;
}

浙公网安备 33010602011771号