【比赛】【SMOJ 2019.1.19】

感觉我可以退役了……最短路建边都建反了


\(\mathrm{T1}\)

一眼\(\mathrm{DP}\),但是好像要求区间最值辅助,所以就加了个\(\mathrm{ST}\)表。
\(\Theta(10^7)\),妥妥地过了。

但是听说大家用的都是单调队列什么的,感觉自己好像学数据结构学傻了?


\(\mathrm{T2}\)

看到只有\(5\)个口味就想到可能是容斥原理,但是比赛时没有草稿纸,时间复杂度算错了,不然至少都能有\(46\)分……

做法就是先开个\(\mathrm{key}\)是结构体的std::map。对于给出的\(5\)个口味,\(01\)二进制枚举一下,看看每种情况在std::map中有多少个,然后看枚举到的状态(二进制数)的\(1\)的个数的奇偶性决定是加还是减。

加减完之后再把这些状态插入std::map即可。

时间复杂度是\(\Theta(n\times 32\times (\log_2(32n)+5\times \log_2(5))) \simeq 4.8\times 10^7\),但考虑到\(\mathrm{STL}\)普遍常数巨大,所以需要卡常。(如果不想卡常的话,可以考虑tr1::unordered_map


\(\mathrm{T3}\)

这一题还简单一点,就是说假如哪个牧场有草,就把这个牧场原来的边复制一遍,然后把边权减去草的美味值,然后把\(\mathrm{BFS}\)的队列的信息扩充一下,把距离数组开多一维以区别有没有吃过草即可。

但是我tm复制边的时候弄反了……
(因为我是从\(n\)号牧场跑反图,所以新加的边也要建反的啊啊啊……)

if( !e.flag ) Add_Edge(pos,e.to,e.len-val,1);	//Wrong
if( !e.flag ) Add_Edge(e.to,pos,e.len-val,1);	//Correct

综上所述,可以退役。

posted @ 2019-08-01 11:13  info___tion  阅读(98)  评论(0编辑  收藏  举报