思路
这题其实有很多方法,但是我最先想到的是按照奶牛的高度排序处理。而且这种方法也可以做被困在干草堆(金)。当然按照位置排序也是可以的。
首先按照奶牛的高度降序排序,在处理一只奶牛时,把大于等于它的高度的2倍的奶牛的位置放进set中,再判断一下set中的位置在当前奶牛两边的位置是否小于等于d,计入答案即可。
时间复杂度$O(N\log N)$,与其他方法相同,但常数比单调队列大。因为后者只要用到sort,比set常数小得多。
这题其实有很多方法,但是我最先想到的是按照奶牛的高度排序处理。而且这种方法也可以做被困在干草堆(金)。当然按照位置排序也是可以的。
首先按照奶牛的高度降序排序,在处理一只奶牛时,把大于等于它的高度的2倍的奶牛的位置放进set中,再判断一下set中的位置在当前奶牛两边的位置是否小于等于d,计入答案即可。
时间复杂度$O(N\log N)$,与其他方法相同,但常数比单调队列大。因为后者只要用到sort,比set常数小得多。
这题要求的是带负权边的最短路,显然不能直接用Dijkstra。然而Bellman-Ford或SPFA的时间复杂度最坏$O(NM)$,而且众所周知,USACO总是卡SPFA的。尽管这题数据比较老,因此SPFA+SLF可以水过,但是正解并不是如此。
顺便说一下,用优先队列优化SPFA并不有效(来自[模板]单源最短路-题解),在这题比普通SPFA更慢。然而在某些边权为正的卡SPFA的图中,几乎和Dijkstra不相上下。
可以发现,图有一个很强的性质:对于无向边,边权总是正的,因此每个无向边联通块是强联通的。而可能的负权边保证不能反向联通,因此把无向边联通块缩点后,得到的就是DAG。这样就可以在块内使用Dijkstra,块间利用拓扑排序更新答案。时间复杂度$O(M\log N)$。
题目来源或改编自USACO月赛,顺序与难度无关。
项目名称 | 穿越马路 | 2048 | 瓶颈 | GPS的决斗 |
---|---|---|---|---|
文件名 | helpcross.* | 2048.* | bottleneck.* | gpsduel.* |
时间限制 | 1s | 2s | 1s | 3s |
空间限制 | 512MB | 512MB | 512MB | 512MB |
优化选项 | 无 | 无 | 无 | -O2 |
测试点数量 | 10 | 20 | 10 | 10 |
测试点分数 | 10 | 5 | 10 | 10 |
比较方式 | SPJ | 全文 | 全文 | SPJ |
部分分 | 有 | 无 | 无 | 有 |
$C,N\le10$
这么小的数据,应该随便怎么搜索都可以吧。我没有写过。
$C,N\le500$
直接二分图最大匹配,用匈牙利算法,应该是提高组要求。输出方案只要输出match[]
数组。时间复杂度近似是$N^3$的,应该很容易得到这个分。
USACO07MAR Gold T2:Ranking the Cows
原题范围:$n\le1000,m\le10000$
应该可以发现,把一对关系转换成一条边后,问题就转换成求出有向图的传递闭包。做完传递闭包后,答案就等于$\frac {n*(n-1)/2}2$-联通的点对数。当有向图中出现环时,即为自相矛盾。
考虑如何计算传递闭包:
使用$f_{i,j}=f_{i,j}\lor(f_{i,k}\land f_{k,j})$,其中$k,i,j\in 1\ldots n$计算。当然,初始值为。
最后统计答案时注意减去自环,同时判断是否有环。
这样时间复杂度时$O(n^3)$的,可以得到30分。
题目来源于USACO月赛,数据范围有所加强
项目名称 | 排序 | 录制 | #加法解释 | #新挑战* |
---|---|---|---|---|
文件名 | sort.* | record.* | interpreter.* | challenge.* |
时间限制 | 2s | 1s | 1s | 5s |
空间限制 | 512MB | 512MB | 512MB | N/A |
测试点数量 | 20 | 10 | 14 | 3 |
测试点分值 | 5 | 10 | 7~8 | N/A |
额外的编译选项 | -O2 | -O2 … | ||
类型 | 传统 | 传统 | 传统 | 交互 |
比较方式 | 全文 | SPJ | 全文 | 全文 |
部分分 | 无 | 有 | 无 | 无 |
tmpfile
函数创建临时文件,在关闭文件后将自动删除。
1
2
3
4
5
6
#include<stdio.h>
FILE *tmpfile( void );
//C
#include<cstdio>
std::FILE* std::tmpfile();
//C++
新挑战*
为附加题,同时测试交互题的情况。