题目链接:http://codeforces.com/contest/430
A:给出x轴上的n个点和m个区间,每个点只能染成红色或蓝色,对所有区间,是否存在一种染色方案使得落在每个区间中红色点的个数和蓝色点的个数相差不超过1,如果存在输出染色方案(n个点的颜色,0为红色,1为蓝色)。
分析:这道题放在A的位置,且后面标了easy,但这道题过得并不多。数据规模很小,暴力估计行。其实考虑将这些点交替染色,这样对于任一个区间都满足相差不超过1的要求,所以只需要知道n就行了。问题输入点的坐标不是按顺序给出的,需要对下标排下序,当时这点没想到WA了4次就去睡了。
B:给出一串各种颜色的球,相同颜色且连续的球的个数不超过2,给出一种消去规则:如果有3个或3个以上的球具有相同颜色且位置连续,则它们可以消去,两边如果有球则会在它们消去后连接在一起。现在给出一个球,已知颜色,可以将它放到任意位置,问它最多能消去多少个球。
分析:数据很小,暴力就行。可以将输入稍微处理一下:分别保存输入的不相邻且不同颜色球的个数,然后就对每个可行的位置暴力一下。
C:给出一颗树,树的每个节点有个标记(值取0或1),给出一种操作:如果对某个节点的标记进行异或操作,则它的儿子节点不变,而孙子节点叶进行异或操作。给出树的初始状态和目标状态,问最少经过多少次异或操作(对一个节点进行异或时,由此产生的孙子的异或操作不计在内,总体只算1次),可以从初始到达目标态。
分析:乍看挺难的,其实可以从根节点分析:如果初始根节点不相同,至少要进行1次,然后比较根节点的儿子节点……,因为每次不同都至少要一次,所以最少的次数不小于这个次数之和。另一方面只要从根出发按照BFS的顺序一层层向下时,每次遇到不同时就进行操作,就一定能达到目标状态。所以这个次数之和就是所求的最小次数。实现可以用DFS下传标记,由于兄弟节点互不影响,所以DFS是对的。
D:给出一个权值矩阵,走两条路:(1,1)->(n,m) (n,1)->(1,m),第一条路走时只能向下或向右,第二条向上或向右,给出这两条路有且只有一个交点这个条件,问这两条路经过的权值之和最大时是多少。
分析:维护从四个角出发到达每个点的最大值,枚举交点的位置更新即可。
F:给出n个节点每个节点对应子树的大小,问这颗树是否存在(n<=24)。
分析:考虑如果构造出满足条件的树。
(1) 如果一个节点的子树大小为n,必然是根节点。
(2) 子节点的子树大小小于祖先节点的。
(3) 相同大小的子树可以互换父节点,互换之后仍然满足条件,这点很关键。
这样,对子树大小的从大到小的顺序检查是否能构成每个节点,dfs也应该可以((3))。