[APIO] [最短路] [UOJ#111] APIO2015 Jakarta Skyscrapers

题目传送门
容易看出是最短路,但是直接暴力加边最多可以加出 n 2 n^2 n2条,这是57pts的,所以需要优化…
一种优化方法是利用分块思想,网上有很多就不再赘述了,大体思路是:根据摩天楼分成 n \sqrt n n 块,如果 p i ≥ n p_i\ge \sqrt n pin 就暴力建边,如果 p i < n p_i< \sqrt n pi<n 就按步数拆点,再连一些使图联通的边就好了。
这种方法最多建边数为 n n n\sqrt n nn 级别的,请注意级别二字以防RE。
但是这玩意特别好卡,只要 p i p_i pi特殊(如相同且特别小)就可以卡出TLE或MLE…(虽然原题数据没卡,UOJ97分到BZOJ是可以A的)
所以我们反卡过去,改变策略,改变块大小…
然后:
Click here to get further information
卡了20+次,发现UOJ一共加了50+组数据卡试块大小的程序…这都有毒…
所以说这玩意不是最优的…
(不过那些卡块大小的你们够了…)
怎么办?
不会了,直接暴力…
首先,如果一条边的终点处没有doge,这条边不能要,可以少一些边。
其次,根据那些卡的数据 p i p_i pi都一样,如果一个建筑物处已经加过 p i p_i pi这种边,以后的就可以不加了,这样可以少加很多边。
为了再少加一些边,可以把输入按 p i p_i pi从小到大排序。
然后用堆优化Dijkstra代替SPFA,开个O2,就能过了。
然后其实被卡在ET#31无法自拔…那个AC应该是卡时过的…
随便吧大家卡一卡…
Code
UPD:还有一种写法…应该是卡不掉的…
请参考这里的代码
Hack太危险了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值