Loading

笔记 暴力&搜索

(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\)

例题

[CSP-J2019 江西] 次大值

\(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\) 即可。

[CSP-J2019 江西] 道路拆除

边权均为 \(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;
}
posted @ 2024-08-22 19:15  Merlin_Meow  阅读(38)  评论(1)    收藏  举报
Sakana Widget 自定义角色自适应示例