当前位置: 代码迷 >> 综合 >> [codechef MARCH17]SUMDIS
  详细解决方案

[codechef MARCH17]SUMDIS

热度:74   发布时间:2024-01-11 19:00:50.0

题目大意

有一个一行上有n个点的图
第i个点向i+1连长度为a[i]的有向边,向i+2连长度为b[i]的有向边,向i+3连长度为c[i]的有向边
问两两间最短路长度之和
1n105

水法

先来说说我的水法:
考虑从后往前枚举起点,那么设当前到i,如果在分别以i+1,i+2,i+3为起点的最短路树中x点的父亲都是一样的,那么在后来枚举的i里面x的父亲是一样的。对于这样的点我就用并查集将它并到父亲那儿去。这样做之后每次需要考虑的点都很少,然后就跑的比正解还快了。

正解

考虑分治,每次删掉中间三个点,那么整个图就会被分成两部分。
接着考虑怎么计算以左边的点为起点,右边的点为终点的答案,那么必定会经过中间的点。
对于两个点x,y(x在左边,y在右边),那么他们的贡献应该形如min(x1+y1,x2+y2,x3+y3)
考虑如果最后他们的贡献是x1+y1
那么有 x1+y1x2+y2 x1+y1x3+y3
变形一下得到 x1?x2y2?y1 x1?x3y3?y1
这样就得到了一个二维偏序关系,排序+线段树轻松解决
对于x2+y2和x3+y3而言类似,但是由于对于小于有不严格小于与严格小于之分,这就导致要分三种情况来打
对于中间三个点的影响显然可以直接计算

Code

juhytfrhyujihyutfrghyu8hyu8hyu8hyu8hyu84eer5t67yu90i4erfgtyuuhytfrtfry6r54ew4e45678987yu6t5r4e5r67764eyuhtfrt6654fresxewu7t64w3e5rt67y89765r4e556789876t54r6788987654re67804ewtyutrsegtfr67yu6

怎么样是不是看到了一堆乱码,我告诉你我刚被滚iu8765678u990876546677898765r4e589edfrgthhggdcfv dcxsdhgtfvsxfrxdeswzsfrgtvbfghhjunybgvf dcv键896787654r67yu89u765rthyuhytfrde hgt67rty5tfrr盘fkhghkbjmtfgjordfghhftdrfirjkobtyuioui9ytfi hfv hvyiugjk vn了
好吧其实是先留个坑,下周要段考,有空再回来补坑