题目大意
有一个一行上有n个点的图
第i个点向i+1连长度为a[i]的有向边,向i+2连长度为b[i]的有向边,向i+3连长度为c[i]的有向边
问两两间最短路长度之和
1≤n≤105
水法
先来说说我的水法:
考虑从后往前枚举起点,那么设当前到i,如果在分别以i+1,i+2,i+3为起点的最短路树中x点的父亲都是一样的,那么在后来枚举的i里面x的父亲是一样的。对于这样的点我就用并查集将它并到父亲那儿去。这样做之后每次需要考虑的点都很少,然后就跑的比正解还快了。
正解
考虑分治,每次删掉中间三个点,那么整个图就会被分成两部分。
接着考虑怎么计算以左边的点为起点,右边的点为终点的答案,那么必定会经过中间的点。
对于两个点x,y(x在左边,y在右边),那么他们的贡献应该形如min(x1+y1,x2+y2,x3+y3)
考虑如果最后他们的贡献是x1+y1
那么有 x1+y1≤x2+y2 和 x1+y1≤x3+y3
变形一下得到 x1?x2≤y2?y1 和 x1?x3≤y3?y1
这样就得到了一个二维偏序关系,排序+线段树轻松解决
对于x2+y2和x3+y3而言类似,但是由于对于小于有不严格小于与严格小于之分,这就导致要分三种情况来打
对于中间三个点的影响显然可以直接计算
Code
juhytfrhyujihyutfrghyu8hyu8hyu8hyu8hyu84eer5t67yu90i4erfgtyuuhytfrtfry6r54ew4e45678987yu6t5r4e5r67764eyuhtfrt6654fresxewu7t64w3e5rt67y89765r4e556789876t54r6788987654re67804ewtyutrsegtfr67yu6
怎么样是不是看到了一堆乱码,我告诉你我刚被滚iu8765678u990876546677898765r4e589edfrgthhggdcfv dcxsdhgtfvsxfrxdeswzsfrgtvbfghhjunybgvf dcv键896787654r67yu89u765rthyuhytfrde hgt67rty5tfrr盘fkhghkbjmtfgjordfghhftdrfirjkobtyuioui9ytfi hfv hvyiugjk vn了
好吧其实是先留个坑,下周要段考,有空再回来补坑