BZOJ 3445 Roadblock
先跑一边最短路,然后枚举最短路上的每条边,将路径翻倍然后跑Dijstra.
因为不在最短路径上的边没用贡献,然后最短路径最长为 n−1
复杂度 O(nmlogm)
BZOJ 1579 道路升级
两维:k使用了多少次更新,u最短路ww咱可以跑dp?
分层图,第一层:原图,第二层内部:原图,然后从第一层点u向第二层点v连一条长度为0的边,从第二层点v再向第一层点u连一条长度为0的边。
因为有可能用不完k个,所以需要从u到u连一条长度为0的边(单向的)
BZOJ 4152 The Captain
假设\(x_1<x_2<x_3\)那么选择\(x_3\)不如选择\(x_1->x_2\),再选择\(x_2\)到\(x_3\)
按x轴排序,相邻的点建边,然后就是O(n);
按照某维坐标排序,相邻两个点在这一维度上的差值最小,所以两两连边,长度为这一维度上的差值(不用考虑另外一维度的,就算另外一维度的更小,在连另外一维度的时候也能够抵达)。然后跑最短路即可。
BZOJ 1050 旅行 COMF
枚举最小边,然后大概就是跑最小生成树的思路,然后找最大边
枚举最小边,用更大的边做 Kruskal,当 S 和 T 连通立即 Break。
LCT,从大到小加边维护最小生成树。
1.边按权值排序,标号1~m
2.初始化一个枚举起点sta=1
3.初始化并查集
4.从sta开始顺推,利用并查集加边,直到s与t连通
5.记录当前边编号为r
6.初始化并查集
7.从r逆推,利用并查集加边,直到s与t连通
8.得到当前边编号,记为l
9.[l,r]是一组比较优的可行解,更新答案
10.枚举起点sta变为l+1,返回第3步继续执行
bzoj 1821 部落划分
o(n^2)先建边,选中一条边,代表这条边所联通的点形成一个部落。
1.二分考虑,mid是最远距离,然后所有<mid的边都要在连通块内部,这个时候看是否可以建出k个连通块,如果可以,那么将mid增大,否则减小
2.kruskal选边,从小到大选取,当恰好形成了k个连通块的时候,退出循环。
把一个部落内看做连通块然后最大化所有没选中的边的值,选中n-k条边,停止算法。(那些边权比较小的形成环的边已经在并查集的时候给忽略掉了,并不影响最终答案);
BZOJ 3714 Kuglarz
询问ci,j实际上是在s[r]和s[l-1]连一条边,然后要将所有边和s[0]连起来,加边以后,跑最小生成树;
推知前缀和,就可以推知a的序列;
询问l,r区间,可以知道s[r]和s[l-1]奇偶性是否相同,然后奇偶性是有传递性,然后让s[0]和s[1~n]都和点0连通,最小生成树;
s[0]显然是偶的,然后如果s[1]是奇的,显然1就有小球rrr。反之没有,然后就这样推就好了???
我们想象有一个虚拟的0号盒子,其中没有小球。
比较明显的是知道[i,j]的奇偶性,等价于知道[0,j]与[0,i-1]差的奇偶性,而又由于0号的盒子的奇偶性已知,所以说只要知道[0,1]、[0,2]、...[0,n]的奇偶性,就能知道每一个盒子的奇偶性。又有:如果知道[l,k]和[k+1,r]的奇偶性,就可以得到[l,r]的奇偶性。所以。如果把一次询问[i,j]当作在图上的一条无向边(i-1,j),那么就需要让每一个节点都与0属于同一个连通块中。这样,我们就把原问题转化为了最小生成树问题。
BZOJ 4144 Petrol
考虑对于每个不是加油站的点,如果剩下的油>d,那么先去d'加满在回来的油量一定也>d?
一次dij处理出每个非加油站的点距离其最近的加油站是哪个,有多远。以所有加油站为原点,做多远最短路。
重构:对一条边,找到其左边点的最近加油站,右边点的最近加油站,然后在这两点之间连一条边r。
枚举原图的边,如果两点最近加油站不同,就将两个加油站连边,边权为两个点到最近加油站的距离和再加上这两个点的距离和,然后跑最小生成树?
首先注意到起点和终点都是加油站; 假设中途经过某个非加油站的点u,u连到v,离u最近的加油站是x,那么从u到x加油后回到u,再到v一定不比直接从u到v差; 因为u一定从某个加油站来,设最后经过的加油站为y,u点油量为B1 = b - dis(y,u),而如果u不可以走到x一定不能走到其他任何加油站自然也到不了终点,如果可以到x加满油也一定可以再从x回来,油量为B2 = b-dis(x,u) , 因为dis(y,u) >= dis(x,u)所以B1 <= B2 ; 考虑重新构图:nr[x]表示离x最近的加油站,dis[x]表示x和nr[x]的距离,可以用多源点dijkstra处理出所有nr[x]和dis[x]; 对于原图中边(u,v) 连边(nr[u] , nr[v] , dis[u] + dis[v] + w(u,v) ) ; 这就变成了一个图,只选<=b 的边问两点连通性,可以离线或者用kruskal重构树做;
BZOJ 1880 Elaxia的路线
记四个关键点为 E1,E2,W1,W2。
一条边 < u, v, w > 在从 S 到 T 的最短路上,当且仅当\(D_{S,u} + w + D_{v,T} =D_{u,v}\)。
找出所有同时在 E1 到 E2 和 W1 到 W2 最短路上的有向边,一定无环形成 DAG。
拓扑排序求 DAG 最长路。
注意:对于同时在 E1 到 E2 和 W2 到 W1 最短路上的有向边再做一次
BZOJ 2612 Sums
如果k可以被凑出来,在moda[1]意义下,所有%a[1]==k相等的都可以表示出来
设 a[1] 是最小的,在模 a[1] 意义下,0 到 a[1] − 1 每个位置都有其最小可被表示值。而如果 k 是可被表示的,那么k + a[1], k + 2 × a[1], . . . 都可被表示。故问题转化为求解每个位
置最小可被表示数字。
建立 a[1] 个点,对于每个\(a[j],j \neq1\),我们理解为可以花费a[j] 代价从 x 点转移到 (x + a[j]) mod a[1] 点。建边之后从 0号点出发做单源最短路即可。
然后我们画个图李姐一下:
某神仙题目rrw
时间复杂度\(O(QlogQ)\)
简单来说,枚举最后一个人是谁,然后将其他人取一个∪,这样就可以求出最后一个人得到的座位了wer
线性基rwr
就是集合里的数互相^不会产生0;
线性基是啥?
你可以理解为将一个序列处理完之后得到的产物,并且有如下性质(后面有证明):
- 原序列里面的任意一个数都可以由线性基里面的一些数异或得到。
- 线性基里面的任意一些数异或起来都不能得到0
- 线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的
然后有个题:给n个数,每个数有一个权值wi,现在求最少的权值,让其是线性基?
题目忘了,反正和kruskal的思路是一样的。
Floyd快速幂↑
这样可以求只经过k个点的最短路rr;
如何求长度最小的负环:
Floyd求最小的k,A的k次方产生负环,然后可以像树上倍增一样处理,降低时间复杂度。